3 回答
TA贡献1798条经验 获得超7个赞
从你的问题来看,这不是很清楚,但如果我理解正确的话,你想要这个:
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),
]);
TA贡献1875条经验 获得超3个赞
定义
来自:用户输入
至:用户输入
目标:数据库字段
逻辑
您必须涵盖 4 种情况:
逐年
>
变化不匹配,因为你没有覆盖一天。
年复一年
==
。(标准)目标必须是
>=
“从AND
” 目标必须是<=
“到”。From-Year
+1
<
To-Year(From 相对于 To 超过 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')
作为 SQL
-- 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
TA贡献1797条经验 获得超4个赞
您可以使用此查询
$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';
- 3 回答
- 0 关注
- 133 浏览
添加回答
举报