我有一个名为date_created
的DATETIME字段的表,需要使用这种查询检查一些数据:
SELECT * FROM table WHERE UNIX_TIMESTAMP(date_created) + $number < UNIX_TIMESTAMP()
是否可以在没有UNIX_TIMESTAMP()函数的情况下执行此操作?也许与NOW())? 如果是的话,会更快吗?
答案 0 :(得分:2)
是否可以在没有UNIX_TIMESTAMP()函数的情况下执行此操作?也许用NOW())?
不完全是。虽然您可以执行以下操作,但它不会达到完全相同的结果:
SELECT * FROM `table` WHERE date_created + INTERVAL $number SECOND < NOW()
原因在于,TIMESTAMP
与DATETIME
不同,$number
既不打算也不能及时表示特定实例;相反,它有效地代表了日历/时钟的显示(不一样)。
当使用不通过UTC时间戳的上述查询时,比较仅仅是现在时钟是否显示的日期/时间晚于数据库中记录的日期/时间的问题(加{{1 }}秒。。
然而,当转换为UTC时间戳时,相应时钟显示的时区变得相关,并且因为许多时区不是恒定的(例如,它们经常四处移动以进行夏令时),多个DATETIME
值可能会导致相同的UTC时间戳。
例如:
CREATE TABLE `table` (date_created DATETIME);
INSERT INTO `table` VALUES ('2012-10-28 01:00:00'), ('2012-10-28 02:00:00');
然后在英国2012-10-28 02:00:00
运行时比较两个查询的结果:
您的原始查询:
SET SESSION time_zone = 'Europe/London';
SELECT *
FROM `table`
WHERE UNIX_TIMESTAMP(date_created) + 100
< UNIX_TIMESTAMP('2012-10-28 02:00:00');
上面的替代查询:
SELECT *
FROM `table`
WHERE date_created + INTERVAL 100 SECOND
< '2012-10-28 02:00:00';
如果是的话,它会更快吗?
可能(比较的词典顺序就足够了,而不是根据会话时区的规则解析并将DATETIME
值转换为UTC,然后进行减法和符号检查),但我建议您执行自己的基准测试
答案 1 :(得分:0)
如果可能,应避免在WHERE子句中使用eval表达式。它会阻止正确使用索引。如果可能,在代码中进行数学运算并将值作为查询参数发送。