MySQL中的時間概念主要分為DATE(日期, 格式為"YYYY-MM-DD")和TIME(時間, 格式為"HH:MM:SS")兩類, 其它的類型, 如DATETIME(日期時間)和TIMESTAMP(時間戳)則是DATE和TIME的結(jié)合(見注解1), YEAR(年)和MONTH(月)則可理解成是DATE類型的子項, 它們的零值(Zero Value)表示如下表:
Data Type(數(shù)據(jù)類型) | "Zero" Value(零值) | Description(描述) |
---|---|---|
DATE | '0000-00-00' | 格式: 'YYYY-MM-DD' |
TIME | '00:00:00' | 格式: 'HH:MM:SS' |
DATETIME | '0000-00-00 00:00:00' | 格式: 'YYYY-MM-DD HH:MM:SS' |
TIMESTAMP | '0000-00-00 00:00:00' | 格式: 'YYYY-MM-DD HH:MM:SS' |
YEAR | 0000 | 格式: YYYY |
MONTH | 00 | 格式: MM |
其中, DATETIME和TIMESTAMP的格式是一樣的, 區(qū)別在于:
DATETIME范圍(可包含6位精度的毫秒小數(shù)部分) |
---|
'1000-01-01 00:00:00[.000000]' 到 '9999-12-31 23:59:59[.999999]' |
TIMESTAMP范圍(可包含6位精度的毫秒小數(shù)部分) |
---|
'1970-01-01 00:00:01[.000000]' 到 '2038-01-19 03:14:07[.999999]' |
DATETIME的范圍更久一些, 而TIMESTAMP的范圍相對就短了, 這是因為TIMESTAMP的定義是從"1970年1月1日00時00分00秒"開始的總秒數(shù), 是一個13位的數(shù)(包含最右3位保存毫秒的位數(shù)), 所以, 它只能計時到2038年1月19號凌晨3點14分07秒這個時間, 再多一秒, 保存時間數(shù)值的"time_t"類型的32位"signed int"就會溢出, 系統(tǒng)會認為時間是"1901年12月13日20時45分52秒"了.
使用中, 通過使用MySQL內(nèi)置的時間操作函數(shù), 可以組合出一些時間篩選的條件:
1.系統(tǒng)輸出'年/月/星期'等日期:
SELECT NOW(); # => '2017-09-28 22:06:52';
SELECT WEEK(NOW()); # => 39, 2017年的第39周;
SELECT MONTH(NOW()); # => 9, 2017年的9月;
SELECT YEAR(NOW()); # => 2017, 2017年;
SELECT TIMESTAMP(NOW()); # => '2017-09-28 23:12:00';
2.從時間戳的時間值轉(zhuǎn)化成DATE形式的:
SELECT FROM_UNIXTIME(1506610900, '%Y-%m-%d %H:%m:%i'); # => '2017-09-28 23:09:01';
3.獲取某種格式的時間:
SELECT NOW(); # => '2017-09-28 21:35:31', 'YYYY-MM-DD HH:MM:SS'的形式;
4.轉(zhuǎn)換成DATE的格式:
SELECT DATE(CURDATE()); # => '2017-09-28', 'YYYY-MM-DD'的形式;
5.計算時間差的:
SELECT DATE_SUB(DATE(NOW()), INTERVAL 1 DAY); # => '2017-09-27';
注解1:
官方文檔: "The DATETIME type is used for values that contain both date and time parts".
參考來源:
1.MySQL 5.7 官方文檔;
2.南風葉: 時間戳與2038問題;
個人經(jīng)驗:
Java對我的影響太大了, 學習時主要接觸的就是這門語言, 但是, 學習MySQL(推而廣之到其它語言或計算機工具中)時, 要首先快速接納MySQL的概念, 再和原有的Java印象做對比, 才能快速有效地構(gòu)建知識樹, 如若不擺脫原有印象對新學習領(lǐng)域的影響, 會拖重學習的步伐.