按日期选择条目 - >= NOW(),MySQL

34

我有一个事件日历表格,我想选择日期等于或大于今天的事件。当我使用以下SELECT语句时,它只会检索未来的事件(> NOW()):

<?php    
$db->query("SELECT * FROM events WHERE event_date >= NOW()");
?>

我该如何选择所有今天或未来的事件?

谢谢

6个回答

52

您正在寻找 CURDATE() 函数:

$db->query("SELECT * FROM events WHERE event_date >= CURDATE()");

或者:

$db->query("SELECT * FROM events WHERE event_date >= CURRENT_DATE()");

好的回答,但只是检查时间而没有日期! - Iman Marashi
1
SELECT * FROM events WHERE event_date >= NOW() - Iman Marashi
CURDATE和NOW有什么区别? - WTFZane
区别在于NOW()包含时间信息。但是你可能需要使用UTC_TIMESTAMP()而不是NOW()CURDATE() - Alexander S.

20

这个查询出现错误的原因是:

SELECT * FROM events WHERE event_date >= NOW()

...因为NOW()函数包含日期和时间,所以返回未来记录的原因是时间部分指示了[函数或触发]语句开始执行的时间。这意味着DATETIME数据类型中一天的开始看起来像:2010-06-24 00:00:00(到微秒精度的YYYY-MM-DD HH:MM:SS),而NOW()函数显示的内容类似于2010-06-24 14:24:31...

以下是您的选项:

SELECT * FROM events WHERE event_date >= DATE(NOW())
SELECT * FROM events WHERE event_date >= DATE(CURRENT_TIMESTAMP)
SELECT * FROM events WHERE event_date >= CURRENT_DATE()
SELECT * FROM events WHERE event_date >= CURRDATE()

2

您也可以这样做

<?php    
$db->query("SELECT * FROM events WHERE UNIX_TIMESTAMP(event_date) >=     UNIX_TIMESTAMP(NOW())");
?>

如果您同时使用时间和日期,那么使用CURTIME()不如以下方法更准确


1

如果你只关心日期而不关心时间,可以使用CURDATE()代替NOW()

当然,你也可以使用同义词CURRENT_DATE(带或不带括号),但我指出的文档给出了CURDATE作为首选拼写方式;-)。


0

你的问题在于now()非常准确。因此,今天和之前的日期因为它们从一天开始就已经过去了。

使用这个:

select * from events where datediff(event_date, now()) >= 0;

0

这里是CURDATE与NOW之间的区别:

mysql> select CURDATE();
+------------+
| CURDATE()  |
+------------+
| 2017-03-17 |
+------------+
1 row in set (0.03 sec)

mysql> select NOW();
+---------------------+
| NOW()               |
+---------------------+
| 2017-03-17 09:04:45 |
+---------------------+
1 row in set (0.00 sec)

我总是使用NOW以确保准确性


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,