如何在MySQL中将时间戳日期与仅日期参数进行比较?

时间:2012-05-07 13:39:57

标签: mysql datetime date

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

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

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

感谢

8 个答案:

答案 0 :(得分:113)

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

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

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

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

答案 1 :(得分:5)

 WHERE cast(timestamp as date) = '2012-05-05'

答案 2 :(得分:4)

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

答案 3 :(得分:2)

使用MYSQL的转换函数:

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

这应该有效

答案 4 :(得分: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 AM。但是,您也可以通过比较运算符来进行“间隔'1天”操作,以使读者更友好地使用非BETWEEN方法:

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

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

使用

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

答案 7 :(得分:0)

当我读到您的问题时,我认为您已经在 Oracle DB 上,直到我看到标签“MySQL&#39;”。无论如何,对于使用Oracle的人来说,就是这样:

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