我試圖在兩個日期之間選擇優惠,一個是開始日期,一個是到期日期,如果到期日期為空或為空,它將始終顯示優惠。
桌子
---------------- --------------------- ---------------------
| deal_title | deal_start | deal_expire |
---------------- --------------------- ---------------------
| Example Deal | 10-24-2021 16:10:00 | 10-25-2021 16:10:00 |
| Example Deal 2 | 10-24-2021 16:10:00 | NULL |
---------------- --------------------- ---------------------
Php 函式按時區獲取當前日期。
function getDateByTimeZone(){
$date = new DateTime("now", new DateTimeZone("Europe/London") );
return $date->format('m-d-Y H:i:s');
}
mysql查詢:
SELECT deals.*, categories.category_title AS category_title
FROM deals
LEFT JOIN categories ON deal_category = categories.category_id
WHERE deals.deal_status = 1
AND deals.deal_featured = 1
AND deals.deal_start >= '".getDateByTimeZone()."'
AND '".getDateByTimeZone()."' < deals.deal_expire
OR deals.deal_expire IS NULL
OR deals.deal_expire = ''
GROUP BY deals.deal_id ORDER BY deals.deal_created DESC
uj5u.com熱心網友回復:
你沒有真正解釋你遇到了什么問題。過去曾多次撰寫過這樣的查詢,您可能需要在日期資格的到期側周圍加上括號。
WHERE deals.deal_status = 1
AND deals.deal_featured = 1
AND deals.deal_start >= '".getDateByTimeZone()."'
AND (
'".getDateByTimeZone()."' < deals.deal_expire
OR deals.deal_expire IS NULL
)
如果您沒有在 OR 子句周圍放置括號,那么只要到期日期為 NULL 并且這不是您想要的,運算子優先級將導致整個 WHERE 子句為真。您需要在此處使用復合 OR 子句。
我認為您也不需要與空字串進行比較,只是假設您把它放在那里試圖解決問題,所以我將它留在了我的示例代碼中。
此外,我對 PHP 字串插值不夠熟悉,無法知道將“getDateByTimeZone”函式的結果插入該查詢的方式是否存在問題。根據過去使用 PHP 的經驗,它對我來說看起來很時髦,但我忽略了它的那一部分,假設有一些東西包裝了這段代碼,可以正確決議它。
uj5u.com熱心網友回復:
最好的辦法是在你的資料庫中從一開始就擁有 MySQL 日期時間
但是您可以在 MySQL 中完成所有操作。
STR_TO_DATE 每次運行都會花費時間
當你把所有過期日期 a () 放在一起時,如果你是真的,它會回傳一個真的
CREATE TABLE deals ( deal_id int, deal_status int, deal_featured int, deal_category int, `deal_title` VARCHAR(14), `deal_start` VARCHAR(19), `deal_expire` VARCHAR(19) ,deal_created DATEtime );
INSERT INTO deals (deal_id,deal_status,deal_featured,deal_category,`deal_title`, `deal_start`, `deal_expire`,deal_created) VALUES (1,1,1,1,'Example Deal', '10-24-2021 16:10:00', '10-25-2021 16:10:00',NOW()), (2,1,1,1,'Example Deal 2', '10-24-2021 16:10:00', NULL,NOW());
CREATE TABLE categories (category_id int,category_title varchar(20) )
INSERT INTO categories VALUES(1,'test')
SELECT deals.deal_id, MIN(`deal_title`), MIN(`deal_start`), MIN(`deal_expire`),MIN(deals.deal_created) as deal_created , MIN(categories.category_title) FROM deals LEFT JOIN categories ON deal_category = categories.category_id WHERE deals.deal_status = 1 AND deals.deal_featured = 1 AND STR_TO_DATE(deals.deal_start, "%m-%d-%Y %H:%i:%s") >= NOW() - INTERVAL 1 DAY AND (NOW() < STR_TO_DATE(deals.deal_expire, "%m-%d-%Y %H:%i:%s") OR deals.deal_expire IS NULL OR deals.deal_expire = '') GROUP BY deals.deal_id ORDER BY deal_created DESC交易編號 | MIN(`deal_title`) | MIN(`deal_start`) | MIN(`deal_expire`) | 交易創建| MIN(categories.category_title) ------: | :---------------- | :------------------- | :------------------ | :------------------ | :----------------------------- 1 | 示例交易 | 10-24-2021 16:10:00 | 10-25-2021 16:10:00 | 2021-10-24 22:42:34 | 測驗 2 | 示例交易 2 | 10-24-2021 16:10:00 | 空 | 2021-10-24 22:42:34 | 測驗
db<>在這里小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/336026.html
下一篇:無法使用外部應用決議XML
