使用CURRENT_DATE减去数值时MySQL的奇怪行为

时间:2015-04-02 01:55:46

标签: mysql date

在MySQL中使用CURRENT_DATE函数时遇到了奇怪的意外行为。请考虑以下事项:

SELECT 
  DATE(CURRENT_DATE - 0) AS 'today',
  DATE(CURRENT_DATE - 1) AS 'yesterday',
  DATE(CURRENT_DATE - 2) AS '2 days ago',
  DATE(CURRENT_DATE - 3) AS '3 days ago'

奇怪的是,这会返回两个日期和两个NULL值(在2015-04-01执行时)。以下代码按预期返回四个日期:

SELECT 
  DATE_ADD(CURRENT_DATE, INTERVAL 0 DAY) AS 'today',
  DATE_ADD(CURRENT_DATE, INTERVAL -1 DAY) AS 'yesterday',
  DATE_ADD(CURRENT_DATE, INTERVAL -2 DAY) AS '2 days ago',
  DATE_ADD(CURRENT_DATE, INTERVAL -3 DAY) AS '3 days ago'

任何人都知道为什么前一组代码返回意外结果而后者返回预期结果?

2 个答案:

答案 0 :(得分:1)

因为CURRENT_DATE是日期,而不是整数。考虑第一个查询。 -1是什么意思? -1秒?分钟?小时?天?月?年? MySQL如何猜测?因此存在INTERVAL语句

答案 1 :(得分:1)

日期和日期时间的值"常数"不是日期和时间。它们是字符串或数字,因为文档几乎可以清楚地解释:

  

将当前日期作为一个值返回到' YYYY-MM-DD'或YYYYMMDD   格式,取决于函数是用于字符串还是   数字上下文。

-创建数字上下文。所以,

DATE(CURRENT_DATE - 0) --> DATE(20150401 - 1) = DATE(20150401)

正确转换。但请考虑:

DATE(CURRENT_DATE - 2) --> DATE(20150401 - 2) = DATE(20150399)

这不是一个有效的日期。所以它没有被转换。此外,MySQL确实将20150400识别为日期,这就是为什么转换没有错误。

使用MySQL时,我的建议是使用date_add()date_sub()进行所有日期操作,除非日期列明确地输入为日期数据类型。