Mysql 2月29日日期查询。如果特定日期无效,则在SQL语句中条件所在的日期加上一天

Mysql 2月29日日期查询。如果特定日期无效,则在SQL语句中条件所在的日期加上一天,mysql,laravel,date,leap-year,Mysql,Laravel,Date,Leap Year,我对2月29日的日期有疑问 我有一个查询,它从PHP/Laravel接收年份作为动态参数。不插入月份和日期。发送到数据库的查询包括从当前日期算起的当前年份。我想将日期与数据库中的特定列进行比较,如果日期无效(例如:02-29-2019),我想将日期与03-01-2019进行比较 ->whereRaw("DATE(CONCAT_WS('-',YEAR(?),MONTH(sendDate),DAY(sendDate))) >= birthdate",[$date]) 如果生成的连接

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

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

->whereRaw("DATE(CONCAT_WS('-',YEAR(?),MONTH(sendDate),DAY(sendDate))) 
>= birthdate",[$date]) 
如果生成的连接日期无效,则上面的查询返回null ex: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)
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
MySQL中是否有一个函数可以帮助克服这个问题?我当前查询的问题

不,没有

然而,如果你能帮助你知道闰年是每四年一次:2008年、2012年、2016年。。。 作为整数,它们也是4的倍数。因此,如果一年是闰年,那么:

年份%4=0


您可以尝试使用此选项,以发挥自己的优势。

下面的代码以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

请注意,确定是否为闰年并不是简单地将年份除以4,仅依靠此方法仍将返回无效日期(例如1900%4=0,但它不是闰年)。请参阅以了解更多详细信息。我不知道这一点,但如果它只是表中提到的!有人可能会争辩说,这将再次成为一个Y2K问题,但这取决于数据库的用途和数据存储,它影响的最近两个年份是1900年和2100年,所以只要日期在这些范围内,你就可以侥幸逃脱。虽然就我个人而言,我宁愿执行全部规则以防万一!是的,我同意你的看法。假设世纪是一个廉价的方式来摆脱设计缺陷。