select count(*) from PN_Review where addTime >= '2017-05-01 00:00:00';
结果:3468
select count(*) from PN_Review where addTime >= 1493568000;
结果:37645,这比事实大。
addTime列由timestamp
创建第二次查询我做错了什么?
答案 0 :(得分:0)
以下是第二个查询发生的情况。
MySQL访问表中的每一行,并将addTime
(TIMESTAMP)列中的值转换为字符串值。然后将字符串值与文字“1493568000”进行比较。
addTime >= 1493568000
这与指定`
基本相同 addTime >= '1493568000'
相当于
DATE_FORMAT(addTime,'%Y-%m-%d %T) >= '1493568000'
对于addTime值'1970-01-02'
以及除“0000-00-00”之外的任何非NULL值,所有这些将评估为TRUE。 MySQL必须对表中的每一行执行转换和比较。
考虑将MIN(addTime)
与COUNT(*)
一起添加到SELECT列表中,我希望返回的值与第一个查询返回的值不同。
使用第一个查询中的表达式:
addTime >= '2017-05-01 00:00:00'
MySQL将右侧的文字字符串计算为当前时区中的日期时间值,然后将其与addTime
TIMESTAMP列的值进行比较。 (使用此表单,MySQL可以使用索引(以addTime
作为前导列)来执行范围扫描操作。)
以下是其他一些需要考虑的表格:
UNIX_TIMESTAMP(addTime) >= 1493568000
UNIX_TIMESTAMP
函数将从TIMESTAMP返回内部整数“秒”值,并将其与数字文字进行比较。
addTime >= FROM_UNIXTIME(1493568000)
FROM_UNIXTIME
函数返回的值受会话time_zone
变量设置的影响。将返回的值与TIMESTAMP列进行比较。
考虑一下这个演示:
SET time_zone = '+05:00' ;
SELECT @@time_zone, FROM_UNIXTIME(1493568000) ;
返回
@@time_zone FROM_UNIXTIME(1493568000)
----------- -------------------------
+05:00 2017-04-30 21:00:00
与
比较 SET time_zone = '+00:00' ;
SELECT @@time_zone, FROM_UNIXTIME(1493568000) ;
返回
@@time_zone FROM_UNIXTIME(1493568000)
----------- -------------------------
+00:00 2017-04-30 16:00:00