改变FROM_UNIXTIME的行为(0)

时间:2013-12-04 17:38:01

标签: mysql time prepared-statement unix-timestamp

在我们的项目中,有很多准备好的语句使用timestampFROM_UNIXTIME(?)列设置了一些值。有几个地方逻辑依赖于FROM_UNIXTIME(0)将写0000-00-00 00:00:00的假设。这在测试机上非常有效。

在另一台机器上,mysql配置为具有sql_mode STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION。当我尝试FROM_UNIXTIME(0)时,它会返回

ERROR 1292 (22007): Incorrect datetime value: '1970-01-01 02:00:00' for column 'date' at row 1
不幸的是,我既不能改变预备语句也不能改变mysql配置。有没有办法绕过这些检查并使该功能在第一台机器上工作?我只看到一种方式 - 使用IF语句,但我确信应该有更正确的方法。

这是一个简短的sscce:

CREATE TABLE test ( date TIMESTAMP NOT NULL DEFAULT 0 );
SET sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';
INSERT INTO test VALUES (FROM_UNIXTIME(0));

1 个答案:

答案 0 :(得分:0)

正如The DATE, DATETIME, and TIMESTAMP Types所述:

  

TIMESTAMP的UTC范围为'1970-01-01 00:00:01' UTC到'2038-01-19 03:14:07'

[ deletia ]
     

无效的DATEDATETIMETIMESTAMP值会转换为相应类型('0000-00-00''0000-00-00 00:00:00')的“零”值。< / p>

因此,FROM_UNIXTIME(0)'1970-01-01 00:00:00' UTC,在TIMESTAMP列中无效,并将转换为'0000-00-00 00:00:00'(如果禁用严格模式)。正如Server SQL Modes所述:

  

如果您没有使用严格模式(即,STRICT_TRANS_TABLESSTRICT_ALL_TABLES都未启用),MySQL会为无效值或缺失值插入调整后的值并生成警告。在严格模式下,您可以使用INSERT IGNOREUPDATE IGNORE生成此行为。

因此,您可以这样做:

INSERT IGNORE INTO test VALUES (FROM_UNIXTIME(0));

但请注意,这将忽略所有错误(而不仅仅是无效的时间戳值)。