为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 76 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信