PHP和MySQL:仅比较月份和日期,而不考虑日期字段中的年份 定义逻辑包装在一起 precourse 积木作为sql 参数

问题描述

我有一个日期字段(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('-',MONTH(?),DAY(?)))",[$frm,$frm]);
$listofUSers->whereRaw("DATE(CONCAT_WS('-',DAY(myDate))) <= DATE(CONCAT_WS('-',[$to,$to]);

它对于同一年内的日期非常有用,但是如果提交的“起始日期”和“截止日期”在两个不同的年份中,并且“截止日期”月份小于“起始日期”月份,则失败。

任何想法,不管年份如何,都可以做到

解决方法

您可以使用此查询

$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,]);
,

定义

  • 来自:用户输入
  • 收件人:用户输入
  • 目标:数据库字段

逻辑

您必须解决4种情况:

  1. 年份>年份

    没有匹配项,因为您没有一天。

  2. 年份==年份。 (标准)

    目标必须是>=AND目标必须是<=到。

  3. 从年份+1 <到年份(从到,从到超过1年)

    全部匹配,因为您的服务期限超过一年

  4. 从年份+1==。 (从去年开始,相对于到)

    1. >=来自

      因为您至少需要整整一年才可以匹配所有内容。

    2. 目标>=OR目标<=

      匹配。

包装在一起

NOT(1) AND (2 OR 3 OR (4 AND (4.1 OR 4.2 )))

precourse

我们将日期和月份转换为一个简单的数字,可以轻松进行比较:

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')
            OR
            -- 4.2
            (
                DATE_FORMAT(myDate,'%m%d')
                OR
                DATE_FORMAT(myDate,'%m%d')
            )
        )
    )
)

参数

[$frm,$to,$frm,$to]

您也许可以使用命名绑定。我不知道。 (这将大大缩短参数)


不是睾丸-调试愉快:D

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...