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 模式」。
您可以使用帶有 AT TIME ZONE
運算子的 CAST()
在檢索時將 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
。