MySQL中的時間

我們經常在MySQL中儲存時間,簡單來了解一下。

1 DATE

DATE類型只存在年月日,沒有時分秒。MySQL用 'YYYY-MM-DD' 的格式來檢索和展示此類型。所支持的範圍從 '1000-01-01' 到 '9999-12-31'。

識別格式:

  • 字符串
    • 帶分隔符:'YYYY-MM-DD'、'YY-MM-DD',以及其他用標點符號分割的都行,比如 'YYYY/MM/DD','YYYY^MM^DD','YYYY@MM@DD'等等,都可以。
    • 不帶分隔符:'YYYYMMDD' 或 'YYMMDD','20240225' 和 '020225' 都表示 '2024-02-25',但 '241332'是非法的,存入時會變成 '0000-00-00'
  • 數字:YYYYMMDD或YYMMDD格式,和不帶分隔符的字符串類型;

2 DATETIME

DATETIME用來存儲同時包含日期和時間的部分的值。MySQL用 'YYYY-MM-DD hh:mm:ss' 的格式來檢索和展示此類型。所支持的範圍從 '1000-01-01 00:00:00' to '9999-12-31 23:59:59'。

3 TIMESTAMP

此數據類型用來存儲包含同時包含日期和時間的部分的值。所支持的範圍從 '1970-01-01 00:00:01' UTC 到 '2038-01-19 03:14:07' UTC。

識別格式

  • 字符串
    • 帶分隔符:'YYYY-MM-DD hh:mm:ss' 或 'YY-MM-DD hh:mm:ss'格式
      • 輕鬆的語法也允許,任何標點符號都可以用來區分年月日部分或時分秒部分。比如:'2012-12-31 11:30:45', '2012^12^31 11+30+45', '2012/12/31 11*30*45', 2012@12@31 11^30^45' 都是等同的;
      • 年月日和時分秒部分與秒數小數之間的分隔符只能是小數點;
      • 年月日和時分秒部分之間可以被T分割而不是空格。例如 '2012-12-31 11:30:45' 和 '2012-12-31T11:30:45' 是等同的;
    • 不帶分隔符:'YYYYMMDDhhmmss' 或 'YYMMDDhhmmss'格式
      • '20070523091528' and '070523091528' are interpreted as '2007-05-23 09:15:28';
      • '071122129015' 不合法,因爲分不分的90不合法,會變成 '0000-00-00 00:00:00' 存入;
  • 數值型:YYYYMMDDhhmmss 或者 YYMMDDhhmmss 格式
    • 19830905132800 和 830905132800 與 '1983-09-05 13:28:00' 等同;

DATETIME或TIMESTAMP值可以包括小數秒部分,精度高達微秒(6位數)。特別是,插入DATETIME或TIMESTAMP列的值中的任何小數部分都將被存儲,而不是丟棄。如果包含小數部分,這些值的格式爲'YYYY-MM-DD hh:MM:ss[.小數部分]',DATETIME值的範圍爲'1000-01-01 00:00:00.000000000' 到 '9999-12-31 23:59:59.499999',TIMESTAMP值的範圍是 '1970-01-01 00:00:01.000000' 和 '2038-01-19 03:14:07.499999'。小數部分應始終與其餘時間用小數點分隔;沒有識別出其他小數秒分隔符。

4 TIME

MySQL以'hh:mm:ss'格式來檢索和顯示TIME值(對於較大的小時值,則以'hhhh:mm:ss'格式)。TIME值的範圍可能從 '-838:59:59' 到 '838:59:39'。小時部分可能很大,因爲TIME類型不僅可以用於表示一天中的時間(必須小於24小時),還可以用於表示經過的時間或兩個事件之間的時間間隔(可能遠大於24小時,甚至爲負數)。

識別格式:

  • 字符串
    • 'D hh:mm:ss'格式的字符串,也可以使用以下 "輕鬆" 語法之一:'hh:mm:ss'、'hh:mm'、'D hh:mm'、'D hh' 或 'ss'。這裏,D表示天數,並且可以具有從0到34的值;
    • 沒有分隔符的'hhmmss'格式的字符串,前提是它作爲一個時間是有意義的。'101112' 被理解爲 '10:11:12',但 '109712' 是非法的(它有一個無意義的分鐘部分),變爲 '00:00:00' ;
  • 數字:hhmmss格式,前提是它作爲時間是有意義的。例如,101112被理解爲 '10:11:12';
    • 替代格式:ss、mmss或hhmmss;
  • 帶小數秒部分:後面的小數秒部分以'D hh:mm:ss.fraction'、'hh:mm:ss.fractive'、'hhmmss.fraction' 和 hhmmss.fraction- 時間格式識別,其中fraction是精度高達微秒(6位數)的小數部分。
    • 小數部分應始終與其餘時間相隔一個小數點;無法識別其他小數秒分隔符;
    • 插入TIME列的值中的任何小數部分都將被存儲,而不是丟棄;

5 特殊規定

5.1 日期

  • 當年份是兩位數時,它的世紀數是不明確的,MySQL使用以下規則解釋兩位數的年份值:
    • 70-99 識別成 1970-1999;
    • 00-69 識別成 2000-2069;
  • 對於帶有分隔符的日期部分,如果對於值小於10的月份和日期,沒有必要申明兩位數。比如 '2015-6-9' 和 '2015-06-09' 是一樣的。類似地,對於小於10的時、分、秒值,也沒有必要指明兩位數,比如 '2015-10-30 1:2:3' 和 '2015-10-30 01:02:03' 是一樣的。
  • 對於數字型的值,必須是6、8、12或者14位的長度。
    • 6位:推定爲 YYMMDD 格式,前2位爲年份;
    • 8位:推定爲 YYYYMMDD 格式,前4位爲年份;
    • 12位:推定爲 YYYYMMDD 格式,前4位爲年份;
    • 14位:推定爲 YYYMMDDhhmmss 格式,前4位爲年份;
    • 對於不符合長度的,將用前導零填充到最接近的長度;
  • 對於未限定的字符串,將根據它們的長度來解釋:
    • 對於8/14位長的,推定前4位爲年份;對於其他長度,推定前2位爲年份;
    • 從左到右對字符串進行解釋,以查找字符串中存在的所有部分的年、月、日、小時、分鐘和秒值。這意味着您不應該使用少於6個字符的字符串。例如'9903'並不能用來表示1999年3月,因爲日期部分完全缺失,MySQL會將其轉換爲'零'日期值。但是,可以顯式指定一個零值來表示缺少的月份或日期部分,例如可使用'990300'表示'1999-03-00';

5.2 時間

  • 對於帶有分隔符的字符串,對於值小於10的小時、分鐘、秒數,沒有必要申明兩位數。例如 '8:3:2' 和 '08:03:02' 是一樣的。

6 SQL_MODE

6.1 NO_ZERO_DATE

此模式將影響MySQL服務端是否允許將零值年月日("0000-00-00")作爲合法值。其效果還取決於是否啓用了嚴格的SQL模式。

  • 未啓用嚴格模式,則允許使用"0000-00-00",並且插入不會產生任何警告;
  • 啓用了嚴格模式
    • 未啓用嚴格模式,則允許使用"0000-00-00",只是插入會產生警告;
    • 同時啓用了嚴格模式,則不允許使用"0000-00-00",並且插入會產生錯誤,除非語句中給定了IGNORE。對於INSERT IGNORE和UPDATE IGNORE,允許使用"0000-00-00",並且插入會產生警告。

不贊成使用NO_ZERO_DATE。NO_ZERO_DATE不是嚴格模式的一部分,但應與嚴格模式一起使用,並在默認情況下啓用。如果啓用NO_ZERO_DATE而不啓用嚴格模式,則會出現警告,反之亦然。有關更多討論,請參閱MySQL 5.7中的SQL模式更改。

6.2 NO_ZERO_IN_DATE

此模式將影響服務器是否允許年部分爲非零但月或日部分爲0的日期。(此模式會影響日期,如“2010-00-01”或“2010-01-00”,但不會影響“0000-00-00”。要控制服務器是否允許“0000-00-00-00”,請使用NO_ZERO_DATE模式。)其效果還取決於是否啓用了嚴格的SQL模式。

  • 如果未啓用此模式,則允許零日期部分,並且插入不會產生任何警告;
  • 如果啓用此模式,
    • 未啓用嚴格模式,則零日期部分插入爲"0000-00-00",併產生警告;
    • 同時啓用嚴格模式,則不允許包含零部分的日期,並且插入會產生錯誤,除非也給出IGNORE。對於INSERT IGNORE和UPDATE IGNORE,零部分的日期插入爲“0000-00-00”併產生警告。

不贊成使用NO_ZERO_IN_DATE。NO_ZERO_IN_DATE不是嚴格模式的一部分,但應與嚴格模式一起使用,並在默認情況下啓用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章