2015-04-02 76 views
0

在MySQL中使用CURRENT_DATE函数时,我遇到了奇怪的意外行为。考虑以下内容:使用CURRENT_DATE减数值时MySQL奇怪的行为

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' 

任何人都知道为什么前集的代码返回意外的结果,后者的回报预期的结果?

+0

那么,为什么你认为你可以从日期减少整数? – zerkms 2015-04-02 01:57:08

回答

1

date和datetime“常量”的值不是日期和时间。他们是字符串或数字,如文档几乎清楚地解释:

返回当前日期为“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(),除非日期列明显类型为日期数据类型。

+0

谢谢,这是清楚和有益的。我会为答案投票,但我只是开始我的帐户......唉,我不能。 – mkprkr 2015-04-02 03:30:11

1

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

+0

感谢您的快速回复。一般来说,当您从CURRENT_DATE减1时,确实会减去一天。由于这是默认行为,并且我已经多次看到这一点,所以我开始期待它。您提出的基本原理解释了为什么DATE_ADD方法通常更可取(因为我被迫将INTERVAL指定为DAY),但它并不能解释为什么在某些情况下CURRENT_DATE - 1返回NULL。 @ Gordon-Linoff在下面的解释澄清了这一点。 – mkprkr 2015-04-02 03:39:09