繁体   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