- MySQL中的多種時間和格式數據類型
日期和時間類型是爲了方便在數據庫中存儲日期和時間而設計的。MySQL中有多種表示日期和時間的數據類型。
其中,year類型表示時間,date類型表示日期,time類型表示時間,datetime和timestamp表示日期和時間。實際情況,最後2種使用的比較多。
具體的日期和時間類型如下:
關於上圖的解釋:
1,每種日期和時間類型都有一個有效範圍。如果插入的值超過了這個範圍,系統就會報錯,並將0值插入到數據庫中。
2,不同的日期與時間類型有不同的0值,上表中已經詳細的列出。- OK,現在來仔細的整理下上面說到的幾種類型:
- year類型
year類型使用1個字節來表示年份,MySQL中以YYYY的形式來顯示year類型的值。
給year類型的字段賦值的表示方法如下:
1,使用4位字符串和數字表示。其範圍從1901~~2155。輸入格式爲'YYYY'或YYYY。舉個例子,輸入‘2008’或者2008,可直接保存2008。如果超過了範圍,就會插入0000。
2,使用2位字符串表示。‘00’~~‘69’轉換爲2000~~2069,‘70’~~‘99’轉換爲1970~1999。舉個例子,輸入‘35’,year值會轉換成2035,輸入‘90’,year值會轉換成1990。‘0’和‘00’效果一樣。
3,使用2位數字表示。1~~69轉換爲2001~~2069,70~~99轉換爲1970~~1999。不舉例子了,注意,2位數字和2位字符串是不一樣的。如果插入0,轉換後的year值不是2000,而是0000。OK,針對上面的例子,我們來實際操作下數據庫。
- CREATE TABLE `linkinframe`.`test` (
- `id` INT NOT NULL,
- `a` YEAR NULL,
- PRIMARY KEY (`id`));
CREATE TABLE `linkinframe`.`test` (
`id` INT NOT NULL,
`a` YEAR NULL,
PRIMARY KEY (`id`));
現在往該表中插入幾條數據:- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('1', 1989);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('2', 1990);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('3', 1900);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('4', 2156);
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('1', 1989);
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('2', 1990);
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('3', 1900);
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('4', 2156);
OK,現在數據庫顯示如下:
year類型是使用總結:
1,顧名思義,我們一般用year類型來表示年份,所以在對該字段進行相關操作的時候,最好使用4位字符串或者數字表示,不要使用2位的字符串和數字。
2,有的時候可能會插入0或者‘0’。這裏要嚴格區分0和‘0’,如果向year類型的字段插入0,存入該字段的年份是0000;如果向year類型的字段插入‘0’,存入的年份是2000。
當然字符串‘0’和‘00’和‘000’是一樣的效果,但是‘0000’效果不一樣。因爲如果是4個0的話就使用了year類型賦值的第一種方式,也就是超過了year類型的範圍,插入了0。
關於這點這裏來舉一個實際的例子吧。
建表語句如下:- CREATE TABLE `linkinframe`.`test` (
- `id` INT NOT NULL,
- `a` YEAR NULL,
- PRIMARY KEY (`id`));
CREATE TABLE `linkinframe`.`test` (
`id` INT NOT NULL,
`a` YEAR NULL,
PRIMARY KEY (`id`));
現在往該表中插入幾條數據:- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('1', 0);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('2', 00);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('3', 000);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('4', 0000);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('5', '0');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('6', '00');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('7', '000');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('8', '0000');
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('1', 0);
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('2', 00);
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('3', 000);
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('4', 0000);
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('5', '0');
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('6', '00');
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('7', '000');
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('8', '0000');
OK,現在數據庫顯示如下:
- time類型
Time類型的範圍可以從‘-838:59:59’~~‘838:59:59’。雖然,小時的範圍是0~~23,但是爲了表示某種特殊需要的時間間隔,將Time類型的範圍擴大了。而且還支持了負值。
Time類型的字段賦值的表示方法如下:
1,‘D HH:MM:SS’格式的字符串表示。其中,D表示天數,取值範圍是0~~34。保存時,小時的值等於(D*24+HH)。舉個例子,輸入‘2 11:30:50’,Time類型會轉換爲59:30:50。
當然。輸入時可以不嚴格按照這個格式,也可以是‘HH:MM:SS’,'HH:MM','D HH:MM','D HH','SS'等形式。舉個例子,輸入‘30’,Time類型會自動轉換爲00:00:30。
2,‘HHMMSS’格式的字符串或HHMMSS格式的數值表示,例如,輸入‘123456’,Time類型會轉換成12:34:56;輸入123456,Time類型會轉換成12:34:56。如果輸入0或者‘0’,那麼TIME類型會轉換爲0000:00:00。
3,使用current_time或者current_time()或者now()輸入當前系統時間。
OK,現在我們來實際操作下數據庫中Time類型。
建表語句如下:
- CREATE TABLE `linkinframe`.`test` (
- `id` INT NOT NULL,
- `a` TIME NULL,
- PRIMARY KEY (`id`));
CREATE TABLE `linkinframe`.`test` (
`id` INT NOT NULL,
`a` TIME NULL,
PRIMARY KEY (`id`));
現在往該表中插入幾條數據:- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('1', '1 01:50:50');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('2', '01:50:50');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('3', '50:05');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('4', '1 05:05');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('5', '59');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('6', '66');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('7', '123456');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('8', 123456);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('9', 0);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('10', '0');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('11', now());
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('12', current_time);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('13', current_time());
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('1', '1 01:50:50');
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('2', '01:50:50');
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('3', '50:05');
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('4', '1 05:05');
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('5', '59');
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('6', '66');
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('7', '123456');
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('8', 123456);
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('9', 0);
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('10', '0');
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('11', now());
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('12', current_time);
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('13', current_time());
數據庫顯示如下:關於Time類型的總結:
1,一個合法的Time值,如果超出了Time的範圍,將被裁爲範圍最接近的端點。舉個例子,‘880:00:00’將轉換爲838:59:59。
2,無效的Time值,在命令行下是無法被插入到表中的。舉個例子,我在這裏亂輸入一個字符串的值,數據庫取值28:00:00成功的插入進去啦,MySQL中顯示如下:
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('17', '1 4 4 4 4 65:65')
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('17', '1 4 4 4 4 65:65')
控制檯顯示如下:1 row(s) affected, 1 warning(s): 1265 Data truncated for column 'a' at row 1。所以在使用Time類型用來存儲時間的時候,最好對格式進行一下校驗,不要隨便的格式胡亂的輸入。 3,如果插入的Time值是無效的,系統會提示報錯,即使這個無效值被插入到表中了,其值也會被轉換爲00:00:00。舉個例子,
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('19', '999999');
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('19', '999999');
數據庫中取值00:00:00來做插入 4,Time類型專門用來存儲時間數據,而且只佔3個字節,所以如果只需要記錄時間,選擇Time類型是最合適的。
- Date類型
其中,YYYY表示年,MM表示月,DD表示日。date類型的範圍可以從‘1000-01-01’~~‘9999-12-31’。
給DATE類型的字段賦值的表示方法如下:
1,‘YYYY-MM-DD’或‘YYYYMMDD’格式的字符串表示,這種方式可以表達的範圍是‘1000-01-01’~‘9999-12-31’。
舉個例子,比如現在我輸入‘4008-2-8‘,date類型將轉換爲4008-02-08;輸入’40080308‘,date類型將轉換爲4008-03-08。
2,當然,MySQL中還支持一些不嚴格的語法格式,任何標點都可以用來做間隔符。如’YYYY/MM/DD‘,’YYYY@MM@DD‘,’YYYY.MM.DD‘等分隔形式。
舉個例子,輸入’2011.3.8‘,date類型將轉換爲2011-03-08。
3,’YY-MM-DD‘或者’YYMMDD‘格式的字符串表示,其中’YY‘的取值,’00‘~~’69‘轉換爲2000~~2069,’70‘~~’99‘轉換爲1970~~1999。與year類型類似。
舉個例子,比如現在我輸入’35-01-02‘,date類型將轉換爲2035-01-02;輸入’800102‘,date類型將轉換爲1980-01-02。
4,同樣的,MySQL中也支持一些不嚴格的語法格式,比如’YY/MM/DD‘,’YY@MM@DD‘,’YY.MM.DD’等分隔形式。例如,輸入‘89@3@8’,date類型將轉換爲1989-03-08。
5,YYYYMMDD或YYMMDD格式的數字表示。其中,‘YY’的取值,‘00’~~‘69’轉換爲2000~~2069,‘70’~~‘99’轉換爲1970~~1999。與year類型類似。
舉個例子,比如現在我輸入20080808,date類型將轉換爲2008-08-08;輸入790808,date類型將轉換爲1979-08-08;輸入0,那麼date類型會轉化爲0000-00-00。
6,使用current_date或now()來輸入當前系統時間。
OK,現在我們來實際操作下數據庫中的date類型。
建表語句如下:- CREATE TABLE `linkinframe`.`test` (
- `id` INT NOT NULL,
- `a` DATE NULL,
- PRIMARY KEY (`id`));
CREATE TABLE `linkinframe`.`test` (
`id` INT NOT NULL,
`a` DATE NULL,
PRIMARY KEY (`id`));
現在往表中插入幾條數據:- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('1', '2008-08-08');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('2', '20080808');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('3', '2008@08@08');
- -- 格式出錯,所以插入0000-00-00
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('4', '2008#0808');
- -- 格式沒錯,但是小於了date類型的最小值1000,但是數據庫還是插進去了,我暈
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('5', '0999-08-08');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('6', '690808');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('7', '700808');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('8', 690808);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('9', 700808);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('10', '0');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('11', 0);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('12', now());
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('13', current_date);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('14', current_date());
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('1', '2008-08-08');
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('2', '20080808');
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('3', '2008@08@08');
-- 格式出錯,所以插入0000-00-00
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('4', '2008#0808');
-- 格式沒錯,但是小於了date類型的最小值1000,但是數據庫還是插進去了,我暈
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('5', '0999-08-08');
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('6', '690808');
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('7', '700808');
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('8', 690808);
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('9', 700808);
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('10', '0');
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('11', 0);
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('12', now());
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('13', current_date);
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('14', current_date());
OK,數據庫顯示如下:關於date類型的總結:
1,date類型值戰友4個字節,如果只需要記錄日期,選擇date類型是最合適的。2,雖然MySQL支持的DATA類型的一些不嚴格的語法格式,但是,在實際應用中,最好還是選擇標準形式。日期中使用“-”做分隔符,時間用“:”做分隔符,然後中間用空格隔開。
比如下面格式:2016-03-17 16:27:55。當然如果有特殊需要,可以使用“@”,“*”等特殊字符做分隔符。
- Datetime類型
從其形式上可以看出,dateTime類型可以直接用date類型和Time類型組合而成。
給dateTime類型的字段賦值的表示方法如下:
1,‘YYYY-MM-DD HH:MM:SS’或‘YYYYMMDDHHMMSS’格式的字符串表示。這種方式可以表達的範圍是‘1000-01-01 00:00:00’~~‘9999-12-31 23:59:59’。
舉個例子,比如我現在輸入‘2008-08-08 08:08:08’,dateTime類型轉換爲2008-08-08 08:08:08,輸入‘20080808080808’,同樣轉換爲2008-08-08 08:08:08。
2,MySQL中還支持一些不嚴格的語法格式,任何的標點都可以用來做間隔符。情況與date類型相同,而且時間部分也可以使用任意的分隔符隔開,這與Time類型不同,Time類型只能用‘:’隔開呢。
舉個例子,比如我現在輸入‘2008@08@08 08*08*08’,數據庫中dateTime類型統一轉換爲2008-08-08 08:08:08。
3,‘YY-MM-DD HH:MM:SS’或‘YYMMDDHHMMSS’格式的字符串表示。其中‘YY’的取值,‘00’~~‘69’轉換爲2000~~2069,‘70’~~‘99’轉換爲1970~~1999。與year型和date型相同。
舉個例子,比如我現在輸入‘69-01-01 11:11:11’,數據庫中插入2069-01-01 11:11:11;比如我現在輸入‘70-01-01 11:11:11’,數據庫中插入1970-01-01 11:11:11。
4,當然這種格式化的省略YY的簡寫也是支持一些不嚴格的語法格式的,比如用‘@’,‘*’來做間隔符。
5,使用now()來輸入當前系統日期和時間。
OK,現在我們來實際操作下數據庫中德爾dateTime類型。
建表語句如下:- CREATE TABLE `linkinframe`.`test` (
- `id` INT NOT NULL,
- `a` DATETIME NULL,
- PRIMARY KEY (`id`));
CREATE TABLE `linkinframe`.`test` (
`id` INT NOT NULL,
`a` DATETIME NULL,
PRIMARY KEY (`id`));
現在我想數據庫中插入幾條數據:- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('1', '2008-08-08 08:08:08');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('2', '20080808080808');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('3', '2008@08@08 08*08*08');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('4', '69-01-01 11:11:11');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('5', '70-01-01 11:11:11');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('6', 20080808080808);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('7', 690808080808);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('8', 700808080808);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('9', 0);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('10', now());
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('1', '2008-08-08 08:08:08');
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('2', '20080808080808');
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('3', '2008@08@08 08*08*08');
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('4', '69-01-01 11:11:11');
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('5', '70-01-01 11:11:11');
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('6', 20080808080808);
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('7', 690808080808);
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('8', 700808080808);
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('9', 0);
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('10', now());
OK,現在數據庫顯示如下: datetime類型總結:
dateTime類型用來記錄日期和時間,其作用等價於date類型和Time類型的組合。一個dateTime類型的字段可以用一個date類型的字段和一個time類型的字段代替。但是如果需要同時記錄日期和時間,選擇dateTime類型是個不錯的選擇。- timestamp類型
timestamp類型使用4個字節來表示日期和時間。timestamp類型的範圍是從1970-01-01 08:00:01~~2038-01-19 11:14:07。
MySQL中也是以‘YYYY-MM-DD HH:MM:SS’的形式顯示timestamp類型的值。從其形式可以看出,timestamp類型與dateTime類型顯示的格式是一樣的。
給timestamp類型的字段複製的表示方法基本與dateTime類型相同。值得注意的是,timestamp類型範圍比較小,沒有dateTime類型的範圍那麼大。所以輸入值時要保證在timestamp類型的有效範圍內。
OK,現在我們來實際操作下數據庫中timestamp數據類型。
建表語句如下:- CREATE TABLE `linkinframe`.`test` (
- `id` INT NOT NULL,
- `a` TIMESTAMP NULL,
- PRIMARY KEY (`id`));
CREATE TABLE `linkinframe`.`test` (
`id` INT NOT NULL,
`a` TIMESTAMP NULL,
PRIMARY KEY (`id`));
現在我們往表中插入幾條數據:- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('1', '2008-08-08 08:08:08');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('2', '20080808080808');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('3', '2008@08@08 08*08*08');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('4', '69-01-01 11:11:11');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('5', '70-01-01 11:11:11');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('6', 20080808080808);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('7', 690808080808);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('8', 700808080808);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('9', 0);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('10', now());
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('1', '2008-08-08 08:08:08');
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('2', '20080808080808');
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('3', '2008@08@08 08*08*08');
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('4', '69-01-01 11:11:11');
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('5', '70-01-01 11:11:11');
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('6', 20080808080808);
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('7', 690808080808);
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('8', 700808080808);
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('9', 0);
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('10', now());
OK,現在數據庫顯示如下:從數據庫顯示的結果來看,timestamp的範圍確實很小的,2069明顯的超過了2038,所以數據庫插入0。 - OK,實際使用情景中,我們使用timestamp類型和dateTime類型比較多,這裏我們來對比一下
(1.1),使用current_timestamp來輸入系統當前日期與時間
(1.2),輸入null時,系統會輸入系統當前日期與時間
(1.3),無任何輸入時,系統會輸入null。
資料上面說系統會輸入系統當前日期與時間,但是我自己嘗試了下,如果輸入null的時候,數據庫中也是null,鬱悶。
OK,現在我們來演示下這種情況。
建表語句和插入的sql語句如下:
- CREATE TABLE `linkinframe`.`test` (
- `id` INT NOT NULL,
- `a` TIMESTAMP NULL,
- PRIMARY KEY (`id`));
CREATE TABLE `linkinframe`.`test` (
`id` INT NOT NULL,
`a` TIMESTAMP NULL,
PRIMARY KEY (`id`));
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('1', null);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('2', 'NULL');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('3', current_timestamp());
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('1', null);
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('2', 'NULL');
INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('3', current_timestamp());
數據庫顯示如下:
2,timestamp類型還有一個很大的特殊點,就是時間是根據時區來顯示的。例如,在東八區插入的timestamp類型爲2009-09-30 14:21:25,在東七區顯示時,時間部門就變成了13:21:25,在東九區顯示時,時間部門就變成了15:21:25。
3,需要顯示日期與時間,timestamp類型能夠根據不同地區的時區來轉換時間,但是,timestamp類型的範圍太小,其最大時間爲2038-01-19 11:14:07。
如果插入時間的比這個大,將會出錯,我自己實際操作中,數據庫插入0000-00-00 00:00:00。所以需要的時間範圍比較大,還是選擇dateTime類型比較安全。