除了NO_ZERO_DATE 问题之外还有一个另一个问题:MySQL 不使用 ISO 8601 日期,它使用 ISO 9075 或 SQL 日期(实际上它使用各种格式,MySQL 日期处理是相当混乱)。有一些细微的差别,最大的是 9075 中间没有 T。大多数日期 API 通过将 T 设为可选而不是 MySQL 来处理此问题。
mysql> select time('1234-01-01T04:35:51.29Z');
+---------------------------------+
| time('1234-01-01T04:35:51.29Z') |
+---------------------------------+
| 00:12:34 |
+---------------------------------+
1 row in set, 1 warning (0.00 sec)
MySQL 没有给出错误或忽略 T,而是给出了一些非常错误的答案。
mysql> select time('1234-01-01 04:35:51.29Z');
+---------------------------------+
| time('1234-01-01 04:35:51.29Z') |
+---------------------------------+
| 04:35:51.29 |
+---------------------------------+
1 row in set, 1 warning (0.00 sec)
现在好了。
最简单的做法是将 T 替换为空格。然后TIME() 就可以了。
mysql> select time(replace('0000-00-00T04:35:51.29Z', 'T', ' '));
+------------------------------------------------+
| time(substring('0000-00-00T04:35:51.29Z', 12)) |
+------------------------------------------------+
| 04:35:51.29 |
+------------------------------------------------+
1 row in set, 1 warning (0.00 sec)
日期部分将由 DATE() 处理,因为 MySQL 将忽略其余部分。
mysql> select date('2017-02-15T00:00:00.00Z');
+---------------------------------+
| date('2017-02-15T00:00:00.00Z') |
+---------------------------------+
| 2017-02-15 |
+---------------------------------+
1 row in set, 1 warning (0.01 sec)
我强烈建议您将它们合并到一个 datetime 列中,而不是存储单独的日期和时间列。特别是如果它们应该代表一个事件(即 2017-20-15 的 4:35:51.29)。这将使比较变得更加容易,并且您始终可以使用DATE() 和TIME() 提取日期和时间部分。