mysql - 这是检查时间戳/日期时间是否属于指定日期的最佳方法

标签 mysql database datetime date timestamp

有时我在数据库中有日期时间或时间戳列,例如,我需要选择所有时间戳为今天更新的记录。

我通常是这样做的:

SELECT * FROM mytable WHERE CAST(TS AS DATE) = CURDATE();  
SELECT * FROM mytable WHERE CAST(TS AS DATE) = '2009-11-01';

此外,可以使用 DATE() 函数代替强制转换:

SELECT * FROM mytable WHERE DATE(TS) = CURDATE();

问题是哪种方式更正确更快?因为我不确定所有记录的 CAST 是不是一个好主意,也许有更好的方法...

最佳答案

好的,我做了一些测试,这是结果。第一个值在 TS 列上有索引,第二个值在 TS 列上没有索引。

SELECT * FROM parts WHERE CAST(TS AS DATE) = DATE('2009-10-01');

2.1 秒,2.1 秒

SELECT * FROM parts WHERE DATE(TS) = DATE('2009-10-01');

2.1 秒,2.1 秒

SELECT * FROM parts WHERE TS >= DATE('2009-10-01') AND TS < (DATE('2009-10-01') + INTERVAL 1 DAY);

0.1 秒、2.15 秒

SELECT * FROM parts WHERE TS >= '2009-10-01' AND TS < '2009-10-01 23:59:59';

0.1 秒、2.15 秒


因此,如您所见,如果我们在 TS 列上没有索引,则没有区别。但是当我们有索引时会有很大的不同。当我们在索引列上使用 CAST() 或 DATE() 时,索引将无法再使用,因此我们会得到不好的结果。

对于我来说,我会选择这个解决方案:

SELECT * FROM parts WHERE TS >= DATE('2009-10-01') AND TS < (DATE('2009-10-01') + INTERVAL 1 DAY);

我认为这是最优雅的。

附言。我仍在寻找更好的解决方案,所以如果您有,请分享。

关于mysql - 这是检查时间戳/日期时间是否属于指定日期的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1691451/

相关文章:

mysql - 如何使用mysql在给定日期中按另一列查找列组

mysql - 如何在windows下建立mysql数据库

php - PHP统计数据库中相同数据的个数

php - Laravel 模型工厂和 Eloquent;设定日期

datetime - 如何实际保持DateTime.now()为最新状态?

mysql - 用于扩展的 EBS 上的 MySQL 架构(Amazon Web Services)

mysql - 基于其他查询结果的 SQL 查询 - 为什么它很慢?

database - Solaris - 同步磁盘刷新/同步同步?

sql - 十进制字段在 IBM AS400 的窗口上显示负数

javascript - 将时区格式的日期显示为 UTC 时间