我們經常在MySQL中儲存時間,簡單來了解一下。
1 DATE
DATE類型只存在年月日,沒有時分秒。MySQL用 'YYYY-MM-DD' 的格式來檢索和展示此類型。所支持的範圍從 '1000-01-01' 到 '9999-12-31'。
識別格式:
- 字符串
- 數字: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'格式
- 不帶分隔符:'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不是嚴格模式的一部分,但應與嚴格模式一起使用,並在默認情況下啓用。