MySQL文档通常非常模糊关于函数返回的数据类型,UNIX_TIMESTAMP()
也不例外。除非我们检查源代码,否则我们只能做出有根据的猜测。
在Date and Time Type Overview,我们可以读到,TIMESTAMP
数据类型本身具有不依赖于服务器体系结构的记录范围:
范围为“1970-01-01 00:00:01.000000” UTC到 '2038-01-19 03:14:07.999999'UTC。 TIMESTAMP值存储为 自纪元('1970-01-01 00:00:00'UTC)以来的秒数。 A TIMESTAMP无法表示值'1970-01-01 00:00:00',因为 相当于从纪元0秒,值0是 保留代表'0000-00-00 00:00:00 ',“零”TIMESTAMP 值。
即使我们要确保我们通过一个适当的日期类型:
mysql> select
-> str_to_date('2038-01-20', '%Y-%m-%d'),
-> unix_timestamp(str_to_date('2038-01-20', '%Y-%m-%d'));
+---------------------------------------+-------------------------------------------------------+
| str_to_date('2038-01-20', '%Y-%m-%d') | unix_timestamp(str_to_date('2038-01-20', '%Y-%m-%d')) |
+---------------------------------------+-------------------------------------------------------+
| 2038-01-20 | 0 |
+---------------------------------------+-------------------------------------------------------+
1 row in set (0.01 sec)
...我们仍然得到0
,错误愚蠢的功能标志:
如果您传递超出范围的日期UNIX_TIMESTAMP(),则返回0。
所以它是一种安全的假设UNIX_TIMESTAMP()
返回的值为TIMESTAMP
,因此不支持2038+。
简而言之:您必须计算其他地方(即您的客户端代码)的时间戳。由于有一个PHP标签:
$t = new DateTime('2038-01-20', new DateTimeZone('UTC'));
var_dump($t->format('U'));
串(10) “2147558400”
附: MariaDB的,MySQL的叉子,有相同的限制,但它documents it更好:
时间戳在MariaDB的有2147483647最大值,相当于 于2038年1月19日5时14分07秒。这是由于底层的32位 限制。使用超出此日期的函数将导致返回NULL 。
'选择UNIX_TIMESTAMP(“2038年1月19日”)返回2147472000' '而选择UNIX_TIMESTAMP(“2038年1月19日”)返回0'你可以告诉正是在这两个查询区别? –
@安南是一个错字..感谢 –
然后在你的问题中改变它 –