在 SQL 语句中,如何将保存为 TIMESTAMP 的日期与 YYYY-MM-DD 格式的日期进行比较?
前任。:SELECT * FROM table WHERE timestamp = '2012-05-25'
我希望此查询返回在指定日期具有时间戳的所有行,但它只返回具有午夜时间戳的行。
谢谢
您可以使用该DATE()
函数来提取时间戳的日期部分:
SELECT * FROM table
WHERE DATE(timestamp) = '2012-05-25'
但是,如果您在时间戳列上有一个索引,这会更快,因为如果您有一个索引,它可以利用时间戳列上的索引:
SELECT * FROM table
WHERE timestamp BETWEEN '2012-05-25 00:00:00' AND '2012-05-25 23:59:59'
WHERE cast(timestamp as date) = '2012-05-05'
正如一些人所建议的那样,通过使用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'
SELECT * FROM table WHERE timestamp >= '2012-05-05 00:00:00'
AND timestamp <= '2012-05-05 23:59:59'
使用 MYSQL 的转换函数:
SELECT * FROM table WHERE DATE(timestamp) = '2012-05-05'
这应该工作
当我研究这个时,我认为修改 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 点的情况。但是,您也可以通过比较运算符执行“INTERVAL '1 DAY”,以获得更易于阅读的非 BETWEEN 方法:
SELECT *
FROM some_table
WHERE
log_timestamp >= timestamp(CURRENT_DATE()) AND
log_timestamp < timestamp(DATE_ADD(CURRENT_DATE(), INTERVAL 1 DAY));
这两种方法都将使用索引并且应该执行得更快。两者似乎都一样快。
如果您使用 SQL 参数来运行查询,那么这将很有帮助
SELECT * FROM table WHERE timestamp between concat(date(?), ' ', '00:00:00') and concat(date(?), ' ', '23:59:59')
采用
SELECT * FROM table WHERE DATE(2012-05-05 00:00:00) = '2012-05-05'
当我读到你的问题时,我以为你在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(timestamp) = '2012-05-25'
如果由于 DATE 函数而有任何索引,它将起作用,但不会在“时间戳”列上使用索引。下面的查询使用索引并提供更好的性能
SELECT * FROM table WHERE timestamp >= '2012-05-05 00:00:00'
AND timestamp <= '2012-05-05 23:59:59'
或者
SELECT * FROM table
WHERE timestamp >= '2012-05-05' AND timestamp < '2012-05-06'
尝试运行这些以检查统计信息
explain SELECT * FROM table
WHERE DATE(timestamp) = '2012-05-25'
explain SELECT * FROM table WHERE timestamp >= '2012-05-05 00:00:00'
AND timestamp <= '2012-05-05 23:59:59'