0

我的表中有日期和时间列。我想选择日期和时间大于当前时间加一小时的所有对象:

我尝试了以下方法:

SELECT * FROM mytable WHERE date >= CURDATE() AND time >= TIME(NOW()+INTERVAL 1 hour)

然而这在逻辑上是不正确的。如果日期是明天并且时间小于当前的 HH:MM,它将不会选择该记录。如何使用我的日期和时间与当前日期时间进行比较?我正在使用 php 5.2 和 mysql

4

6 回答 6

2

首先,我建议使用 DATETIME 列来使此过滤更有效。但是,如果您无法更改,则此方法有效:

SELECT * FROM mytable
WHERE (date = CURDATE() AND time >= TIME(NOW() + INTERVAL 1 hour))
OR date > CURDATE()
于 2013-04-21T10:09:31.477 回答
1

您可以将您的条件分为两个条件...

  • 当日期等于今天并且比当前时间早一个多小时时:

    date == CURDATE() AND time >= TIME(NOW()+INTERVAL 1 hour)

  • 当日期大于今天时:

    date > CURDATE()

OR...并使用和括号将它们链接在一起:

SELECT * FROM mytable WHERE (date == CURDATE() AND time >= TIME(NOW()+INTERVAL 1 hour)) OR date > CURDATE()
于 2013-04-21T10:09:43.240 回答
1

首先检查日期是否是今天,如果时间大于当前时间。第二个条件是检查日期是否大于当前日期。因为如果日期大于当前日期,那么它的时间就会自动提前。

SELECT * FROM mytable
WHERE (date = CURDATE() AND time >= TIME(NOW() + INTERVAL 1 hour))
OR date > CURDATE()
于 2013-04-21T10:16:36.653 回答
0
SELECT * FROM mytable WHERE date >= CURDATE() AND time >= TIME(HOUR(NOW()) + 1);

或者也许只是

SELECT * FROM mytable WHERE date >= CURDATE() AND time >= HOUR(NOW()) + 1;
于 2013-04-21T10:13:22.223 回答
0

你可以这样做。

SELECT 
* 
FROM
mytable 
WHERE 
CONCAT( date, " ", time ) > (NOW() + INTERVAL 1 HOUR );

我个人建议您摆脱日期和时间的单独字段并创建一个合并的“日期时间”字段。我还建议在该字段中添加一个 INDEX。

这将使您的查询更好更快。:)

于 2013-04-21T12:50:44.103 回答
0

正如@Pekka 所指出的,到目前为止发布的所有答案都会在晚上 11 点到午夜之间给出错误的答案。我不使用 MySQL,但我可以查找资料。更好的方法似乎是 timestamp() 函数。

该参考文献指出:

With two arguments, it adds the time expression expr2 to the date 
or datetime expression expr1 and returns the result as a datetime value. 

为什么不使用带两个参数的 timestamp()?

于 2013-04-21T11:59:15.880 回答