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 關注
- 181 瀏覽
添加回答
舉報