【问题标题】:29 Feb date query. Add one day to the date where condition in SQL statement if specific date is invalid2月29日日期查询。如果特定日期无效,则在 SQL 语句中条件的日期中添加一天
【发布时间】:2019-09-11 14:49:08
【问题描述】:

我对 2 月 29 日的日期有疑问。

我有一个从 PHP/Laravel 接收作为动态参数的年份的查询。未插入月份和日期。发送到数据库的查询包括当前日期的当前年份。我想将日期与数据库中的特定列进行比较,如果日期无效(例如:02-29-2019),我想将日期与 03-01-2019 进行比较

->whereRaw("DATE(CONCAT_WS('-',YEAR(?),MONTH(sendDate),DAY(sendDate))) 
>= birthdate",[$date]) 

如果生成的连接日期无效,则上述查询返回 null 例如:2019-02-29

我想要的 PUSEDO 代码/功能:

if "DATE(CONCAT_WS('-',YEAR(?),MONTH(sendDate),DAY(sendDate) is NULL
and MONTH(sendDate)=03 and DAY(sendDate)=01" THEN 
WHERE Birthdate>= DATE(CONCAT_WS('-',YEAR(?),03,01)
ELSE
WHERE Birthdate>= DATE(CONCAT_WS('-',YEAR(?),MONTH(sendDate),DAY(sendDate)

MySQL 中是否有一个函数可以帮助解决这个问题?我当前查询的问题

【问题讨论】:

    标签: mysql laravel date leap-year


    【解决方案1】:

    以下代码检查格式为 yyyy-mm-dd 的字符串。 如果它是有效日期,则将其转换为日期。 Else 返回下个月的第一天作为日期。

    下面是示例代码:

    DECLARE @T AS VARCHAR(10)
    SET @T = '2019-02-29'
    select  @T as Original,
            TRY_PARSE(@T AS DATE USING 'en-gb') as DateIfValid,
            TRY_PARSE(LEFT(@T,4) + '-' + CAST(CAST(SUBSTRING(@T,6,2) AS tinyint)+1 AS VARCHAR(2)) + '-1' AS DATE USING 'en-gb') as Replacement
    

    返回

    Original   DateIfValid Replacement
    ---------- ----------- -----------
    2019-02-29 NULL        2019-03-01
    

    下面的代码演示了如何将其用作函数:

    select  @T as Original,
           ,ISNULL(TRY_PARSE(@T AS DATE USING 'en-gb'), TRY_PARSE(LEFT(@T,4) + '-' + CAST(CAST(SUBSTRING(@T,6,2) AS tinyint)+1 AS VARCHAR(2)) + '-1' AS DATE USING 'en-gb')) as FinalResult
    
    
        Original   FinalResult
        ---------- -----------
        2019-02-29 2019-03-01
    

    希望这会有所帮助,BR

    【讨论】:

      【解决方案2】:

      不,没有。

      但是如果可以帮助您知道闰年是每四年一次:2008、2012、2016... 被认为是整数,它们也是 4 的倍数。所以,如果一年是闰年,那么:

      YEAR % 4 = 0

      您可以尝试利用它来发挥自己的优势。

      【讨论】:

      • 注意,判断是否是闰年并不是简单的年份是否除以4,仅仅依靠这个方法还是会返回无效的日期(例如1900 % 4 = 0,但是这不是闰年)。有关详细信息,请参阅here。
      • 我不知道这一点,但如果它表只指years on this century it will hold!有人可能会争辩说这将再次成为千年虫,但这取决于数据库的目的和数据存储的目的
      • 是的,它影响的最接近的两个年份是 1900 年和 2100 年,所以只要日期在这些范围内,您就可以侥幸逃脱。尽管就个人而言,我宁愿执行完整的规则以防万一!
      • 是的,我同意你的看法。假设世纪是摆脱设计缺陷的廉价方法。
      猜你喜欢
      • 2014-07-22
      • 2021-04-26
      • 2019-07-10
      • 1970-01-01
      • 1970-01-01
      • 2023-02-15
      • 1970-01-01
      • 2017-06-21
      • 2021-01-26
      相关资源
      最近更新 更多