我有一个旧的PHP系统,使用MySQL 5.5.47作为数据库。
创建系统的人做出了一个奇怪的决定。 在某些情况下,他们保存的日期值不带日期-例如“ 2018-01-00 ”。字段类型为DATE。
很多查询都使用where子句,例如:UNIX_TIMESTAMP(DATE(<DATE>)) BETWEEN 1514757600 AND 1546207210
,其中<DATE>
是包含诸如'2018-01-00','2018-02-00'等记录的列。
这两个时间戳分别表示日期2018年1月1日和2018年12月31日。
在生产中,这种类型的查询运行没有问题。 在我的本地计算机上,它们不返回任何结果。
我发现的是,如果我在生产环境中运行以下命令:SELECT UNIX_TIMESTAMP( DATE( '2018-01-00' ) )
,结果是 1514757600 ,但是在我的本地计算机上,它返回 0 。
我正在使用Docker compose尽可能接近地复制产品。最初,当我遇到此问题时,我已将MySQL 5.6用于本地开发,我尝试使用MySQL 5.5.62,但结果是相同的。
有人知道我如何设置本地MySQL作为生产版本吗?
查询生产:
mysql> SELECT DATE('2018-01-00'), UNIX_TIMESTAMP(DATE('2018-01-00')), UNIX_TIMESTAMP('2018-01-00');
+--------------------+------------------------------------+------------------------------+
| DATE('2018-01-00') | UNIX_TIMESTAMP(DATE('2018-01-00')) | UNIX_TIMESTAMP('2018-01-00') |
+--------------------+------------------------------------+------------------------------+
| 2018-01-00 | 1514757600 | 0 |
+--------------------+------------------------------------+------------------------------+
查询本地:
mysql> SELECT DATE('2018-01-00'), UNIX_TIMESTAMP(DATE('2018-01-00')), UNIX_TIMESTAMP('2018-01-00');
+--------------------+------------------------------------+------------------------------+
| DATE('2018-01-00') | UNIX_TIMESTAMP(DATE('2018-01-00')) | UNIX_TIMESTAMP('2018-01-00') |
+--------------------+------------------------------------+------------------------------+
| 2018-01-00 | 0 | 0 |
+--------------------+------------------------------------+------------------------------+
答案 0 :(得分:0)
事实证明,这是Mysql 5.5.48之前版本中的 bug 。在5.5.48的发行说明中,有一条声明涉及修复与unix_timestamp函数有关的错误。 https://dev.mysql.com/doc/relnotes/mysql/5.5/en/news-5-5-48.html
当使用STR_TO_DATE()函数向UNIX_TIMESTAMP()函数提供了无效的日期时,在将其转换为时间戳值之前未进行任何检查。 (缺陷号21564557)