100

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

前任。:SELECT * FROM table WHERE timestamp = '2012-05-25'

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

谢谢

4

10 回答 10

170

您可以使用该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'
于 2012-05-07T13:42:49.917 回答
11
 WHERE cast(timestamp as date) = '2012-05-05'
于 2012-05-07T13:43:24.257 回答
10

正如一些人所建议的那样,通过使用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'
于 2018-09-13T10:17:01.380 回答
6
SELECT * FROM table WHERE timestamp >= '2012-05-05 00:00:00' 
    AND timestamp <= '2012-05-05 23:59:59'
于 2012-05-07T13:43:26.033 回答
2

使用 MYSQL 的转换函数:

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

这应该工作

于 2012-05-07T13:43:21.293 回答
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 点的情况。但是,您也可以通过比较运算符执行“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));

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

于 2020-01-09T18:01:53.557 回答
0

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

SELECT * FROM table WHERE timestamp between concat(date(?), ' ', '00:00:00') and concat(date(?), ' ', '23:59:59')
于 2014-02-20T16:24:56.357 回答
0

采用

SELECT * FROM table WHERE DATE(2012-05-05 00:00:00) = '2012-05-05' 
于 2016-01-26T13:39:36.747 回答
0

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

SELECT *
FROM table
where timestamp = to_timestamp('21.08.2017 09:31:57', 'dd-mm-yyyy hh24:mi:ss');
于 2017-08-23T07:36:19.033 回答
0
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'
于 2021-10-25T16:27:56.787 回答