为什么mysql timestamp列使用timestamp来搜索得到更大的结果?

时间:2017-05-27 02:35:00

标签: mysql timestamp

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

创建

第二次查询我做错了什么?

1 个答案:

答案 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