Mysql 2月29日日期查询。如果特定日期无效,则在SQL语句中条件所在的日期加上一天
我对2月29日的日期有疑问 我有一个查询,它从PHP/Laravel接收年份作为动态参数。不插入月份和日期。发送到数据库的查询包括从当前日期算起的当前年份。我想将日期与数据库中的特定列进行比较,如果日期无效(例如:02-29-2019),我想将日期与03-01-2019进行比较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]) 如果生成的连接
->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年,所以只要日期在这些范围内,你就可以侥幸逃脱。虽然就我个人而言,我宁愿执行全部规则以防万一!是的,我同意你的看法。假设世纪是一个廉价的方式来摆脱设计缺陷。