簡體   English   中英

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

[英]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 種情況:

  1. 逐年>逐年

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

  2. 從年==到年。 (標准)

    目標必須是>=AND目標必須是<=到。

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

    匹配所有,因為您覆蓋一年以上

  4. 從年度+1 ==年度。 (From 是去年相對於 To)

    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]

您也許可以使用命名綁定。 我不知道。 (這將顯着縮短參數)


不是 testet - 調試愉快:D

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM