[英]PHP and MySQL: Compare only month and day regardless of year in date field
我有一個日期字段(myDate)。 假設該字段具有以下日期:
2015-01-01 2013-12-31
如果用戶使用以下搜索參數搜索字段 (myDate):
從日期: 2018-12-31到日期: 2019-01-05
我希望查詢返回上面列出的日期 2015-01-01 和 2013-12-31 因為它們在用戶提交的日期范圍內(當涉及到月份和日期時)
我嘗試了以下查詢:
$listofUsers->whereRaw("DATE(CONCAT_WS('-',YEAR(NOW()),MONTH(myDate),DAY(myDate))) >= DATE(CONCAT_WS('-',YEAR(NOW()),MONTH(?),DAY(?)))",[$frm,$frm]);
$listofUSers->whereRaw("DATE(CONCAT_WS('-',YEAR(NOW()),MONTH(myDate),DAY(myDate))) <= DATE(CONCAT_WS('-',YEAR(NOW()),MONTH(?),DAY(?)))",[$to,$to]);
它適用於同一年內的日期,但如果提交的 From Date 和 To Date 位於兩個不同的年份並且 To Date 月份小於 From Date 月份,則它會失敗。
任何想法如何使這項工作無論年份如何
您可以使用此查詢
$FromDate = '2019-02-27';
$ToDate = '2020-06-26';
SELECT * FROM `tblname`
WHERE
DATE(myDate) BETWEEN '$FromDate' AND '$ToDate'
OR
DATE(myDate) BETWEEN '$ToDate' AND '$FromDate';
SELECT * FROM `tblname`
WHERE
DATE(myDate) BETWEEN '2019-02-27' AND '2020-06-26'
OR
DATE(myDate) BETWEEN '2020-06-26' AND '2019-02-27';
你的問題不是很清楚,但如果我理解正確你想要這個:
SELECT *
FROM table
WHERE myDate LIKE concat('%', :start_day_of_year, '%')
AND myDate LIKE concat('%', :end_day_of_year, '%')
$users->whereRaw($sql, [
'start_day_of_year' => substr($fromDate, 5),
'end_day_of_year' => substr($toDate, 5),
]);
您必須涵蓋 4 種情況:
逐年>
逐年
沒有匹配,因為你沒有覆蓋一天。
從年==
到年。 (標准)
目標必須是>=
從AND
目標必須是<=
到。
From-Year +1
<
To-Year(From 相對於 To 超過 1 年)
匹配所有,因為您覆蓋一年以上
從年度+1
==
年度。 (From 是去年相對於 To)
至>=
從
匹配所有內容,因為您至少覆蓋了一整年。
目標>=
從OR
目標<=
到
匹配。
NOT(1) AND (2 OR 3 OR (4 AND (4.1 OR 4.2 )))
我們將日期和月份轉換為一個簡單的數字,比較容易:
DATE_FORMAT('2000-01-01','%m%d')
將是0101
=> 101
DATE_FORMAT(?,'%Y')
DATE_FORMAT(?,'%Y')
DATE_FORMAT(?,'%m%d')
DATE_FORMAT(?,'%m%d')
DATE_FORMAT(myDate,'%m%d')
-- 1
NOT(
DATE_FORMAT(?,'%Y') > DATE_FORMAT(?,'%Y')
)
AND
(
-- 2
(
DATE_FORMAT(?,'%Y') = DATE_FORMAT(?,'%Y')
AND
DATE_FORMAT(myDate,'%m%d') >= DATE_FORMAT(?,'%m%d')
AND
DATE_FORMAT(myDate,'%m%d') <= DATE_FORMAT(?,'%m%d')
)
OR
-- 3
(DATE_FORMAT(?,'%Y')+1) < DATE_FORMAT(?,'%Y')
OR
(
-- 4
(DATE_FORMAT(?,'%m%d')+1) = DATE_FORMAT(?,'%m%d')
AND
(
-- 4.1
DATE_FORMAT(?,'%m%d') >= DATE_FORMAT(?,'%m%d')
OR
-- 4.2
(
DATE_FORMAT(myDate,'%m%d') >= DATE_FORMAT(?,'%m%d')
OR
DATE_FORMAT(myDate,'%m%d') <= DATE_FORMAT(?,'%m%d')
)
)
)
)
[$frm, $to, $frm, $to, $frm, $to, $frm, $to, $frm, $to, $to, $frm, $frm, $to]
您也許可以使用命名綁定。 我不知道。 (這將顯着縮短參數)
不是 testet - 調試愉快:D
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.