mysql - 更改 FROM_UNIXTIME(0) 的行为

标签 mysql time prepared-statement unix-timestamp

在我们的项目中,有很多准备好的语句,它们使用 FROM_UNIXTIME(?) 将一些值设置为 timestamp 列。有几个地方的逻辑取决于 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));

最佳答案

The DATE, DATETIME, and TIMESTAMP Types 下所述:

TIMESTAMP has a range of '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC.

[ deletia ]

Invalid DATE, DATETIME, or TIMESTAMP values are converted to the “zero” value of the appropriate type ('0000-00-00' or '0000-00-00 00:00:00').

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

If you are not using strict mode (that is, neither STRICT_TRANS_TABLES nor STRICT_ALL_TABLES is enabled), MySQL inserts adjusted values for invalid or missing values and produces warnings. In strict mode, you can produce this behavior by using INSERT IGNORE or UPDATE IGNORE.

因此,您可以这样做:

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

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

关于mysql - 更改 FROM_UNIXTIME(0) 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20382118/

相关文章:

java - 如何在for循环中执行准备好的语句以从jsp中的表中获取数据?

php - 我做错了什么? (PHP 准备语句)

mysql - 在 MySQL 中使用正确的或可取的不等于运算符

mysql - 按列分组时选择零计数

matlab - 如何找到字符数组中两次之间的小时数差异?

python - 如何在python3上打印当前日期?

mysql - 我怎样才能合并表与mysql中的空行

python - Python 中调用 MySql 的超时

java - 如何使用java从日期中获取小时数

mysql - PDO 准备好的语句绑定(bind)