有时我在数据库中有日期时间或时间戳列,例如,我需要选择所有时间戳为今天更新的记录。
我通常是这样做的:
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/