文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  DATE、DATETIME 和 TIMESTAMP 類型

13.2.2 DATE、DATETIME 和 TIMESTAMP 類型

DATEDATETIMETIMESTAMP 類型相關。本節說明它們的特性、它們的相似之處以及它們的不同之處。MySQL 可以識別多種格式的 DATEDATETIMETIMESTAMP 值,詳見第 11.1.3 節,「日期和時間常值」DATEDATETIME 的範圍描述中,「支援」表示雖然較早的值可能有效,但不能保證。

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。

DATETIMETIMESTAMP 值可以包含尾隨的小數秒部分,精度最高可達微秒(6 位數)。特別是,插入 DATETIMETIMESTAMP 欄位中的值的任何小數部分都會被儲存,而不是被捨棄。如果包含小數部分,這些值的格式是 '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 節,「時間值中的小數秒」

TIMESTAMPDATETIME 資料類型提供自動初始化和更新為目前的日期和時間。如需更多資訊,請參閱第 13.2.5 節,「TIMESTAMP 和 DATETIME 的自動初始化和更新」

MySQL 將 TIMESTAMP 值從目前時區轉換為 UTC 以進行儲存,並從 UTC 轉換回目前時區以進行擷取。(其他類型(例如 DATETIME)不會發生這種情況。)依預設,每個連線的目前時區都是伺服器的時區。時區可以在每個連線的基礎上設定。只要時區設定保持不變,您就會取回與您儲存的值相同的值。如果您儲存 TIMESTAMP 值,然後變更時區並擷取該值,則擷取的值與您儲存的值不同。這是因為在兩個方向的轉換中沒有使用相同的時區。目前的時區可作為 time_zone 系統變數的值取得。如需更多資訊,請參閱第 7.1.15 節,「MySQL 伺服器時區支援」

在將 TIMESTAMPDATETIME 值插入資料表時,您可以指定時區偏移。如需更多資訊和範例,請參閱第 11.1.3 節,「日期和時間常值」

如果 SQL 模式允許此轉換,則無效的 DATEDATETIMETIMESTAMP 值會轉換為適當類型的「」值('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

    另請參閱第 13.2.9 節「日期中的兩位數年份」