DATE
、DATETIME
和 TIMESTAMP
類型相關。本節說明它們的特性、它們的相似之處以及它們的不同之處。MySQL 可以識別多種格式的 DATE
、DATETIME
和 TIMESTAMP
值,詳見第 11.1.3 節,「日期和時間常值」。DATE
和 DATETIME
的範圍描述中,「「支援」」表示雖然較早的值可能有效,但不能保證。
DATE
類型用於具有日期部分但沒有時間部分的值。MySQL 以 '
格式擷取和顯示 YYYY-MM-DD
'DATE
值。支援的範圍是 '1000-01-01'
到 '9999-12-31'
。
DATETIME
類型用於包含日期和時間部分的值。MySQL 以 '
格式擷取和顯示 YYYY-MM-DD hh:mm:ss
'DATETIME
值。支援的範圍是 '1000-01-01 00:00:00'
到 '9999-12-31 23:59:59'
。
TIMESTAMP
資料類型用於包含日期和時間部分的值。TIMESTAMP
的範圍是 '1970-01-01 00:00:01'
UTC 到 '2038-01-19 03:14:07'
UTC。
DATETIME
或 TIMESTAMP
值可以包含尾隨的小數秒部分,精度最高可達微秒(6 位數)。特別是,插入 DATETIME
或 TIMESTAMP
欄位中的值的任何小數部分都會被儲存,而不是被捨棄。如果包含小數部分,這些值的格式是 '
,YYYY-MM-DD hh:mm:ss
[.fraction
]'DATETIME
值的範圍是 '1000-01-01 00:00:00.000000'
到 '9999-12-31 23:59:59.499999'
,而 TIMESTAMP
值的範圍是 '1970-01-01 00:00:01.000000'
到 '2038-01-19 03:14:07.499999'
。小數部分應始終以小數點與時間的其餘部分分隔;不識別其他小數秒分隔符。有關 MySQL 中小數秒支援的資訊,請參閱第 13.2.6 節,「時間值中的小數秒」。
TIMESTAMP
和 DATETIME
資料類型提供自動初始化和更新為目前的日期和時間。如需更多資訊,請參閱第 13.2.5 節,「TIMESTAMP 和 DATETIME 的自動初始化和更新」。
MySQL 將 TIMESTAMP
值從目前時區轉換為 UTC 以進行儲存,並從 UTC 轉換回目前時區以進行擷取。(其他類型(例如 DATETIME
)不會發生這種情況。)依預設,每個連線的目前時區都是伺服器的時區。時區可以在每個連線的基礎上設定。只要時區設定保持不變,您就會取回與您儲存的值相同的值。如果您儲存 TIMESTAMP
值,然後變更時區並擷取該值,則擷取的值與您儲存的值不同。這是因為在兩個方向的轉換中沒有使用相同的時區。目前的時區可作為 time_zone
系統變數的值取得。如需更多資訊,請參閱第 7.1.15 節,「MySQL 伺服器時區支援」。
在將 TIMESTAMP
或 DATETIME
值插入資料表時,您可以指定時區偏移。如需更多資訊和範例,請參閱第 11.1.3 節,「日期和時間常值」。
如果 SQL 模式允許此轉換,則無效的 DATE
、DATETIME
或 TIMESTAMP
值會轉換為適當類型的「「零」」值('0000-00-00'
或 '0000-00-00 00:00:00'
)。確切行為取決於是否已啟用嚴格 SQL 模式和 NO_ZERO_DATE
SQL 模式;請參閱第 7.1.11 節,「伺服器 SQL 模式」。
您可以使用CAST()
搭配 AT TIME ZONE
運算子,在擷取時將 TIMESTAMP
值轉換為 UTC DATETIME
值,如下所示
mysql> SELECT col,
> CAST(col AT TIME ZONE INTERVAL '+00:00' AS DATETIME) AS ut
> FROM ts ORDER BY id;
+---------------------+---------------------+
| col | ut |
+---------------------+---------------------+
| 2020-01-01 10:10:10 | 2020-01-01 15:10:10 |
| 2019-12-31 23:40:10 | 2020-01-01 04:40:10 |
| 2020-01-01 13:10:10 | 2020-01-01 18:10:10 |
| 2020-01-01 10:10:10 | 2020-01-01 15:10:10 |
| 2020-01-01 04:40:10 | 2020-01-01 09:40:10 |
| 2020-01-01 18:10:10 | 2020-01-01 23:10:10 |
+---------------------+---------------------+
如需關於語法和額外範例的完整資訊,請參閱CAST()
函數的描述。
請注意 MySQL 中日期值解譯的某些屬性
MySQL 允許以字串形式指定的數值的「「寬鬆」」格式,其中任何標點符號都可用作日期部分或時間部分之間的分隔符。在某些情況下,此語法可能會產生誤導。例如,由於
:
,'10:11:12'
之類的值可能看起來像一個時間值,但如果在日期內容中使用,則會被解譯為年份'2010-11-12'
。'10:45:15'
值會轉換為'0000-00-00'
,因為'45'
不是有效的月份。在日期和時間部分與小數秒部分之間,唯一可識別的分隔符是小數點。
伺服器要求月份和日期值必須有效,而不僅僅是在 1 到 12 和 1 到 31 的範圍內。如果停用嚴格模式,無效的日期(例如
'2004-04-31'
)會轉換為'0000-00-00'
,並產生警告。如果啟用嚴格模式,無效的日期會產生錯誤。若要允許這類日期,請啟用ALLOW_INVALID_DATES
。如需更多資訊,請參閱第 7.1.11 節,「伺服器 SQL 模式」。MySQL 不接受在日期或月份欄位中包含零或非有效日期的
TIMESTAMP
值。此規則唯一的例外是特殊的「「零」」值'0000-00-00 00:00:00'
,如果 SQL 模式允許此值。確切行為取決於是否已啟用嚴格 SQL 模式和NO_ZERO_DATE
SQL 模式;請參閱第 7.1.11 節,「伺服器 SQL 模式」。包含 2 位數年份值的日期是模糊不清的,因為世紀未知。MySQL 使用以下規則解譯 2 位數年份值
範圍在
00-69
的年份值會變成2000-2069
。範圍在
70-99
的年份值會變成1970-1999
。