python date 和 datetime 的取值範圍(對比 Mysql 的 datetime 和 timestamp)

ponponon發表於2022-03-30

Python 的情況

先來看看 date 型別吧!

In [1]: from datetime import date

In [2]: date.min
Out[2]: datetime.date(1, 1, 1)

In [3]: str(date.min)
Out[3]: '0001-01-01'

In [4]: str(date.max)
Out[4]: '9999-12-31'

可以看到 date 的取值範圍是 0001-01-019999-12-31

再來看看 datetime 吧!

In [5]: from datetime import datetime

In [6]: str(datetime.min)
Out[6]: '0001-01-01 00:00:00'

In [7]: str(datetime.max)
Out[7]: '9999-12-31 23:59:59.999999'

可以看到 datetime 的取值範圍是 0001-01-01 00:00:009999-12-31 23:59:59.999999

Mysql 的情況

來看看 mysql 的情況吧,下面的官方文件中的內容:

The DATE type is used for values with a date part but no time part. MySQL retrieves and displays DATE values in 'YYYY-MM-DD' format. The supported range is '1000-01-01' to '9999-12-31'.
The DATETIME type is used for values that contain both date and time parts. MySQL retrieves and displays DATETIME values in 'YYYY-MM-DD hh:mm:ss' format. The supported range is '1000-01-01 00:00:00' to '9999-12-31 23:59:59'.

The TIMESTAMP data type is used for values that contain both date and time parts. TIMESTAMP has a range of '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC.

總結一下就是:

  • date 的取值範圍:1000-01-019999-12-31
  • timestamp 的取值範圍:1970-01-01 00:00:012038-01-19 03:14:07
  • datetime 的取值範圍:1000-01-01 00:00:009999-12-31 23:59:59

參考資料:mysql 文件

但是需要注意:

Invalid DATE, DATETIME, or TIMESTAMP values are converted to the “zero” value of the appropriate type ('0000-00-00' or '0000-00-00 00:00:00'), if the SQL mode permits this conversion. The precise behavior depends on which if any of strict SQL mode and the NO_ZERO_DATE SQL mode are enabled; see Section 5.1.10, “Server SQL Modes”.

還有這部分:
圖片.png

翻譯成人話的意思,就是 myql 會把無效的 date 設為 0000-00-00,無效的 datetime 和 timestamp 設為 0000-00-00 00:00:00

比如 2022-13-35 就是一個無效的 date,當把這個值插入到 mysql 中的時候,開啟了嚴格模式的 mysql 會報錯,未開啟嚴格模式的 mysql 會轉為 0000-00-00 儲存。

‼️ 所以我們使用 Python 從 mysql 讀取時間型別的時候,一定要注意這個坑!因為 0000-00-00 沒有辦法轉成 Python 的 date 型別,會報錯的!‼️


順便可以看看 Mysql 的 date、timestamp、datetime 各佔用幾個位元組:

  • date 型別 3 位元組
  • timestamp 型別 4 位元組
  • datetime 型別 8 位元組

圖片.png

參考文章:Data Type Storage Requirements


關於 Mysql 插入的時間型別可以是 0000-00-00 這種格式的原因可以參考:MySQL Incorrect datetime value: '0000-00-00 00:00:00'

在 Mysql8 中預設是不可以插入這種無效時間的

相關文章