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'你可以告訴正是在這兩個查詢區別? –
@安南是一個錯字..感謝 –
然後在你的問題中改變它 –