MySQL date_add()在WHERE子句中不起作用?

时间:2010-11-04 15:55:11

标签: mysql phpmyadmin

当我尝试运行以下查询时:

... WHERE `date` = DATE_ADD(NOW(), INTERVAL 10 HOUR)

它不起作用,所以我必须使用$date = date("Y-m-d", strtotime('+10 hours'))

但为什么date_add不起作用?

非常感谢

5 个答案:

答案 0 :(得分:9)

请注意DATE_ADD()函数除了日期之外还返回时间部分。这与使用php date("Y-m-d", strtotime('+10 hours'))不同,后者仅返回日期部分。

SELECT DATE_ADD(NOW(), INTERVAL 10 HOUR);
+-----------------------------------+
| DATE_ADD(NOW(), INTERVAL 10 HOUR) |
+-----------------------------------+
| 2010-11-05 01:59:51               |
+-----------------------------------+
1 row in set (0.00 sec)

您可以改为使用WHERE date = DATE(DATE_ADD(NOW(), INTERVAL 10 HOUR))

SELECT DATE(DATE_ADD(NOW(), INTERVAL 10 HOUR));
+-----------------------------------------+
| DATE(DATE_ADD(NOW(), INTERVAL 10 HOUR)) |
+-----------------------------------------+
| 2010-11-05                              |
+-----------------------------------------+
1 row in set (0.02 sec)

测试用例:

CREATE TABLE tbl (id int, date datetime);

INSERT INTO tbl VALUES (1, '2010-11-04');
INSERT INTO tbl VALUES (2, '2010-11-05');
INSERT INTO tbl VALUES (3, '2010-11-06');
INSERT INTO tbl VALUES (4, '2010-11-07');

SELECT * FROM tbl WHERE date = DATE(DATE_ADD(NOW(), INTERVAL 10 HOUR));
+------+---------------------+
| id   | date                |
+------+---------------------+
|    2 | 2010-11-05 00:00:00 |
+------+---------------------+
1 row in set (0.00 sec)

答案 1 :(得分:3)

NOW()是时间戳,而不是日期。

示例:

mysql> select now(), current_date();
+---------------------+----------------+
| now()               | current_Date() |
+---------------------+----------------+
| 2010-11-04 12:00:01 | 2010-11-04     |
+---------------------+----------------+

我认为这就是你想要的:

... WHERE date = DATE_ADD(CURRENT_DATE(), INTERVAL 10 HOUR)

答案 2 :(得分:1)

您将DateTime(DATE_ADD的结果)与DATE进行比较。您需要WHERE date = DATE(DATE_ADD(NOW(), INTERVAL 10 HOUR))

答案 3 :(得分:1)

此:

WHERE date = DATE_ADD(NOW(), INTERVAL 10 HOUR)

...确实有效(假设date是DATETIME ), but it includes the time portion when the statement was executed -- the日期`值需要匹配要返回的

答案 4 :(得分:0)

我知道这已经得到了回答,但在这个用例中有一个更好的解决方案:

DATE_ADD(TODAY(), INTERVAL 10 HOUR)

这删除了一个额外的操作,因为 TODAY 返回没有时间部分的日期。