如何比较时间戳日期与MySQL中的仅日期参数?


88

在SQL语句中,如何比较保存为TIMESTAMP的日期和YYYY-MM-DD格式的日期?

例如: SELECT * FROM table WHERE timestamp = '2012-05-05'

我希望此查询返回指定日期中所有带有时间戳的行,但是它仅返回具有午夜时间戳的行。

谢谢

Answers:


144

您可以使用该DATE()函数提取时间戳记的日期部分:

SELECT * FROM table
WHERE DATE(timestamp) = '2012-05-05'

但是,如果在timestamp列上有一个索引,这样做会更快,因为如果有一个索引,它可以利用timestamp列上的索引:

SELECT * FROM table
WHERE timestamp BETWEEN '2012-05-05 00:00:00' AND '2012-05-05 23:59:59'

5
通过我刚刚进行的一项小测试,我发现使用BETWEEN的速度比Just FYI快10倍
DarbyM


6

正如某些人所建议的那样,通过使用,DATE(timestamp)您正在对列进行操作,因此您不能依赖索引顺序。

但是,BETWEEN仅当包含毫秒时,使用才会可靠。在示例时间戳中,BETWEEN '2012-05-05 00:00:00' AND '2012-05-05 23:59:59'您将排除时间戳介于2012-05-05 23:59:59.001和之间的记录2012-05-05 23:59:59.999。但是,由于数据类型的精度,即使该方法也存在一些问题。有时会舍入999毫秒。

最好的事情是:

SELECT * FROM table
WHERE date>='2012-05-05' AND date<'2012-05-06'

5
SELECT * FROM table WHERE timestamp >= '2012-05-05 00:00:00' 
    AND timestamp <= '2012-05-05 23:59:59'

2

使用MYSQL的转换功能:

SELECT * FROM table WHERE DATE(timestamp) = '2012-05-05' 

这应该工作


1

在研究此问题时,我认为修改BETWEEN解决方案以显示特定的非静态/字符串日期(而不是可变日期)或今天的日期(例如)为佳CURRENT_DATE()。这将使用log_timestamp列上的索引

SELECT *
FROM some_table
WHERE
    log_timestamp
    BETWEEN 
        timestamp(CURRENT_DATE()) 
    AND # Adds 23.9999999 HRS of seconds to the current date
        timestamp(DATE_ADD(CURRENT_DATE(), INTERVAL '86399.999999' SECOND_MICROSECOND));

我做了几秒/微秒的时间来避免第二天的上午12点。但是,您也可以通过比较运算符执行“间隔'1天”,以使读者更友好地使用非BETWEEN方法:

SELECT *
FROM some_table
WHERE
    log_timestamp >= timestamp(CURRENT_DATE()) AND
    log_timestamp < timestamp(DATE_ADD(CURRENT_DATE(), INTERVAL 1 DAY));

这两种方法都将使用索引,并且应更快地执行MUCH。两者似乎同样快。


0

如果您使用SQL参数运行查询,那么这将很有帮助

SELECT * FROM table WHERE timestamp between concat(date(?), ' ', '00:00:00') and concat(date(?), ' ', '23:59:59')

0

当我读到您的问题时,我以为您一直在使用Oracle DB,直到看到“ MySQL”标签。无论如何,对于使用Oracle的人来说,这就是方法:

SELECT *
FROM table
where timestamp = to_timestamp('21.08.2017 09:31:57', 'dd-mm-yyyy hh24:mi:ss');

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.