我有一个日期字段(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]);
它对于同一年内的日期非常有用,但是如果提交的“起始日期”和“截止日期”在两个不同的年份中,并且“截止日期”月份小于“起始日期”月份,则失败。
任何想法,不管年份如何,都可以做到
答案 0 :(得分:0)
您可以使用此查询
$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';
答案 1 :(得分:0)
从您的问题中不清楚,但是如果我理解正确,那么您需要这样做:
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),
]);
答案 2 :(得分:0)
您必须解决4种情况:
年份>
年份
没有匹配项,因为您没有一天。
年份==
年份。 (标准)
目标必须是>=
到AND
目标必须是<=
到。
从年份+1
<
到年份(从到,从到超过1年)
全部匹配,因为您的服务期限超过一年
从年份+1
到==
。 (从去年开始,相对于到)
至>=
来自
因为您至少需要整整一年才可以匹配所有内容。
目标>=
从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]
您也许可以使用命名绑定。我不知道。 (这将大大缩短参数)
不是睾丸-调试愉快:D