我有一个事件日历表格,我想选择日期等于或大于今天的事件。当我使用以下SELECT语句时,它只会检索未来的事件(> NOW()):
<?php
$db->query("SELECT * FROM events WHERE event_date >= NOW()");
?>
我该如何选择所有今天或未来的事件?
谢谢
您正在寻找 CURDATE() 函数:
$db->query("SELECT * FROM events WHERE event_date >= CURDATE()");
或者:
$db->query("SELECT * FROM events WHERE event_date >= CURRENT_DATE()");
这个查询出现错误的原因是:
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()
您也可以这样做
<?php
$db->query("SELECT * FROM events WHERE UNIX_TIMESTAMP(event_date) >= UNIX_TIMESTAMP(NOW())");
?>
如果您同时使用时间和日期,那么使用CURTIME()不如以下方法更准确
如果你只关心日期而不关心时间,可以使用CURDATE()代替NOW()。
当然,你也可以使用同义词CURRENT_DATE(带或不带括号),但我指出的文档给出了CURDATE作为首选拼写方式;-)。
你的问题在于now()非常准确。因此,今天和之前的日期因为它们从一天开始就已经过去了。
使用这个:
select * from events where datediff(event_date, now()) >= 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以确保准确性
SELECT * FROM events WHERE event_date >= NOW()- Iman MarashiNOW()包含时间信息。但是你可能需要使用UTC_TIMESTAMP()而不是NOW()和CURDATE()。 - Alexander S.