[英]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.