我知道代碼不正確并且應該使用 ADDDATE 函式,但我試圖找出特定行為是否是由這個錯誤引起的。
那么,有沒有人知道如果我有宣告會發生什么
SELECT * FROM MyTable WHERE TheTimestamp > (NOW()-86400);
TheTimestamp 何時屬于日期時間資料型別?
uj5u.com熱心網友回復:
這不是一個錯誤。您只是期望將日期時間轉換為數字不是。
https://dev.mysql.com/doc/refman/8.0/en/date-and-time-literals.html說:
MySQL 以下列格式識別 DATETIME 和 TIMESTAMP 值:
...
- 作為 YYYYMMDDhhmmss 或 YYMMDDhhmmss 格式的數字,前提是該數字作為日期有意義。例如,19830905132800 和 830905132800 被解釋為“1983-09-05 13:28:00”。
https://dev.mysql.com/doc/refman/8.0/en/date-and-time-types.html說:
- 如果值在數字背景關系中使用,MySQL 會自動將日期或時間值轉換為數字,反之亦然。
因此NOW()在算術運算式中使用會將其轉換為數字:
mysql> SELECT now(), now() 0;
--------------------- ----------------
| now() | now() 0 |
--------------------- ----------------
| 2022-10-19 14:13:14 | 20221019141314 |
--------------------- ----------------
您可以看到,只需洗掉標點符號和空格,即可將“2022-10-19 14:13:14”(我測驗此查詢的日期和時間)轉換為整數。這不是一個可以加減的數字,因為值 60-99 不用于秒或分鐘,同樣的值 24-99 用于小時,32-99 用于天,13-99 用于月,等等
您顯示的運算式不會產生作為時間戳有效的數字:
mysql> SELECT now(), now() - 86400;
--------------------- ----------------
| now() | now() - 86400 |
--------------------- ----------------
| 2022-10-19 14:20:09 | 20221019055609 |
--------------------- ----------------
^^ there is no time with 56 minutes
^^^^ yesterday's date should be 10/18
要對日期時間進行算術運算,您應該轉換為以秒為單位的整數度量,然后在整數運算式中使用該值:
mysql> SELECT now(), unix_timestamp(now());
--------------------- -----------------------
| now() | unix_timestamp(now()) |
--------------------- -----------------------
| 2022-10-19 14:16:57 | 1666214217 |
--------------------- -----------------------
或者使用 MySQL 對時間INTERVAL運算式的支持。見https://dev.mysql.com/doc/refman/8.0/en/expressions.html#temporal-intervals
mysql> select now(), now() - interval 86400 second;
--------------------- -------------------------------
| now() | now() - interval 86400 second |
--------------------- -------------------------------
| 2022-10-19 14:24:01 | 2022-10-18 14:24:01 |
--------------------- -------------------------------
uj5u.com熱心網友回復:
DATETIME 和 TIMESTAMP 值分別是長度為 5 和 4 位元組的隱式整數值(對于小數秒精度,可選附加位元組)。數學運算子以及條件運算子將相應地作業。但是,這不會考慮所有隱式轉換,例如使用ADDTIME().
此操作專門查找晚于 1 天前創建的任何記錄,因為 DATETIME 值必須大于(稍后)當前時間 - 86400 秒(1 天/24 小時)前。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/521390.html
上一篇:每天在“真”或“假”之間交替
下一篇:熊貓:按條件分配日期時間
