在SQL语句中,如何将保存为TIMESTAMP的日期与YYYY-MM-DD格式的日期进行比较?
例:SELECT * FROM table WHERE timestamp = '2012-05-05'
我希望此查询返回指定日期内具有时间戳的所有行,但它只返回具有午夜时间戳的行。
感谢
答案 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');