mysql中的date、datetime、timestamp你還不知道怎麼使用嗎

在後端開發中經常會碰到涉及數據庫的場景,不知道屏幕前的你有這樣的疑惑沒有,每每在遇到時間、日期字段總是讓人頭疼,分不清到底是選date還是datetime,亦或是timestamp,真是抓耳撓腮啊,怎麼辦吶,大都翻看之前的表結構,把之前的時間、日期類型抄過來,草草了事。以至於在後面的開發中總是爲時間、日期類型做特殊處理,過後便不再理會這事了,今天就把這事一次性說明白。這裏的環境是mysql

一、引言

在mysql中表示日期和時間的數據類型,大體上有下面幾種,

序號 名稱 描述 定義方式 格式 範圍
1 date 日期 date YYYY-MM-DD '1000-01-01' to '9999-12-31'
2 time 時間 time[.fraction] hh:mm:ss[.000000] '-838:59:59.000000' to '838:59:59.000000'
3 datetime 日期+時間 datetime[.fraction] YYYY-MM-DD hh:mm:ss[.000000] '1000-01-01 00:00:00' to '9999-12-31 23:59:59'
4 timestamp 時間戳 timestamp[.fraction] YYYY-MM-DD hh:mm:ss[.000000] '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC
5 year year YYYY '1901' to '2155'

注意在上面的表格中,我把日期和時間分開進行了描述,主要是因爲在很多場景中很容易把這兩個詞當作同一個意思,在這裏時間指的時分秒,日期指的是年月日。

比較常用的有date、datetime、timestamp,今天就對這三種表示日期和時間的類型進行分析,看下在實際開發過程中如何選擇?

二、日期/時間類型

爲了弄清楚這三種類型之間的區別,我從網上也看了不少資料,最後發現還是要去官網找尋真理,感興趣的小夥伴可以看下mysql的官方文檔:https://dev.mysql.com/doc/refman/8.0/en/date-and-time-types.html,

關於這些內容從下方的官方截圖都可以找到,

下面具體總結下

1、date

date僅包含日期,mysql存儲和顯示的格式是'YYYY-MM-DD',可以表示的範圍是'1000-01-01' to '9999-12-31'

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

timestamp包含日期、時間兩部分,在存儲時存儲的是時間戳,可以表示的範圍是'1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC,這裏需要注意timestamp是有時區概念的,該類型可跟隨時區變化,默認情況下是服務器的時區,如果一個數據庫連接設置了時區參數,那麼該類型的值會根據連接設置的時區來存儲和返回值。

在前面說到在存儲時存儲的是時間戳,也就是從1970-01-01 00:00:00 UTC到要存儲的時間所相差的毫秒數。關於UTC是世界協調是,感興趣的可以自己查閱資料。

 

還有強調下,

  1. 上面介紹了date、datetime、timestamp這三種數據類型,還有一個點需要着重強調,datetime、timestamp是可以有小數位的,一共最多可以有6位,所以在定義是可以是datetime(3),要說明的是默認情況下是datetime(0),由於是0所以通常情況下就倍省略了;
  2. timestamp的範圍剛纔也看到了,最大到'2038-01-19 03:14:07' UTC,所以很多情況下最好不用該類型,避免超過最大範圍產生問題,可以datetime來代替;
  3. datetime、tiemstap類型有自動初始話和更新爲當前的日期和時間的功能;

三、實踐

上面說了那麼多理論知識,下面肯定要實踐下,實踐出真知嘛,

下面是一個建表語句,

create table test(
 id int not null  auto_increment,
 t_date date default null,
 t_date_time datetime not null default current_timestamp,
 t_timestamp timestamp not null default current_timestamp on update  current_timestamp,
 t_date_time2 datetime(3) not null default current_timestamp(3),
 primary key(id)
 
 );

可以看到t_date_time是datetime類型,默認是自動插入當前日期+時間

t_timestamp是timestamp類型,默認自動插入當前日期+時間,且更新是更新爲當前日期和時間

t_date_time2是datetime(3)類型,默認自動插入當前日期+時間,且current_timestamp(3),

下面插入數據,

可以看到t_date_time、t_timestamp、t_date_time2都是可以自動賦值爲當前日期+時間(我這裏系統時間就是2022-05-01,大家不用誤會),下面修改下,

可以看到t_timestamp的時間已經自動更新爲當前'2022-05-01 06:37:32'了。很奇怪吧。

四、總結

本文主要分享了,mysql中常見的日期、時間數據類型,下面幾條需謹記,

1、datetime、timestamp都可以滿足需求的情況下,優先選擇datetime,因爲其表示的範圍更大;

2、格式化方式爲'YYYY-MM-DD hh:mm:ss[.000000]',在進行插入的時候使用的是相應的字符串的格式進行插入;

3、自動初始化和更新語句要牢記,'dt datetime not null default current_timestamp on update current_timestamp';

4、current_timestamp可以寫成current_timestamp(0);

5、標識記錄的新增或更新時間的字段,設置爲數據“default current_timestamp on update current_timestamp‘更省心;

 

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