亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

PHP 和 MySQL:僅比較日期字段中的月份和日期,而不考慮年份

PHP 和 MySQL:僅比較日期字段中的月份和日期,而不考慮年份

PHP
catspeake 2023-10-01 15:54:19
我有一個日期字段(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]);它對于同一年內的日期非常有用,但如果提交的“起始日期”和“截止日期”位于兩個不同的年份并且“截止日期”月份小于“起始日期”月份,則它會失敗。任何想法如何使這項工作無論年份如何
查看完整描述

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), 

]);


查看完整回答
反對 回復 2023-10-01
?
翻過高山走不出你

TA貢獻1875條經驗 獲得超3個贊

定義

  • 來自:用戶輸入

  • 至:用戶輸入

  • 目標:數據庫字段

邏輯

您必須涵蓋 4 種情況:

  1. 逐年>變化

    不匹配,因為你沒有覆蓋一天。

  2. 年復一年==。(標準)

    目標必須是>=“從AND” 目標必須是<=“到”。

  3. From-Year +1 <To-Year(From 相對于 To 超過 1 年)

    全部匹配,因為您的覆蓋時間超過一年

  4. 年復一年+1 ==。(從去年相對于到)

    1. >=

      匹配所有內容,因為您至少覆蓋了一整年。

    2. 目標>=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


查看完整回答
反對 回復 2023-10-01
?
繁星coding

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';


查看完整回答
反對 回復 2023-10-01
  • 3 回答
  • 0 關注
  • 181 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號