在SQL语句中,如何比较保存为TIMESTAMP的日期和YYYY-MM-DD格式的日期?
例如: SELECT * FROM table WHERE timestamp = '2012-05-05'
我希望此查询返回指定日期中所有带有时间戳的行,但是它仅返回具有午夜时间戳的行。
谢谢
Answers:
您可以使用该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'
正如某些人所建议的那样,通过使用,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'
在研究此问题时,我认为修改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。两者似乎同样快。
当我读到您的问题时,我以为您一直在使用Oracle DB,直到看到“ MySQL”标签。无论如何,对于使用Oracle的人来说,这就是方法:
SELECT *
FROM table
where timestamp = to_timestamp('21.08.2017 09:31:57', 'dd-mm-yyyy hh24:mi:ss');
使用
SELECT * FROM table WHERE DATE(2012-05-05 00:00:00) = '2012-05-05'