標籤:

資料庫出生日期用什麼類型比較好?datetime 或 varchar ?

經歷兩個項目,oracle項目用varchar2存儲日期,MySQL用datetime存儲日期,哪種方案好,還是與具體數據產品有關


當然是datetime,不過oracle應該有隻date不time的類型


日期相關的欄位,建議一定要用datetime, timestmp類型的數據類型,在此處使用varchar類型的數據類型會有如下弊端 :

1. 無法阻止不規範的數據寫入到數據表中

2. 不能用索引來優化資料庫操作(這個沒實測,腦補的)

在工作中,曾經需要對4個數據表做增量同步功能,使用了數據記錄的時間戳來作為增量同步的依據。結果由於資料庫是使用varchar2數據類型來表示時間戳,最後導致這個增量同步的速度特別慢(表裡有大約4億條記錄, 增量同步一個表一次需要執行30-60分鐘).

在這個場景下,如果資料庫當初使用timestmp來表示時間信息(並設置好索引),那麼性能可能會有戲劇化的不同


個人認為還是時間戳好


維護某電信運營商oracle資料庫多年,表示日期數據基本是date型,只有年月的用varchar2或者char,好處見下:

1、數據規範。date對合法日期型會校驗,包括閏年2月這種。避免字元型變數產生的某月32號,日期長度不對,日期格式不統一等問題。曾經有過痛苦經歷,面對字元型的2013111這種數據不知道是11月1日還是1月11日,只想說日…

2、檢索效率。如果你經常在where後面帶這個日期,或者要給這個欄位建索引。你可以試試date和char的差別,更別說分區索引了。

3、計算方便。當你計算兩個日期差幾天,你是願意對著char寫個function判斷大月小月閏月呢,還是直接拿date變數date1-date2呢?當你要批量把日期往後延50天的話,你是願意寫一大段存儲過程呢,還是直接update table set date1=date1+50呢?

如果date型變數就是一個char(14)的話,那根本不值得被單獨創建出來,既然存在,那就一定有特殊意義和使用價值。


Why not assuming everyone is born after 1900-1-1, then use int as a date offset.


必然datetime啊


varchar2 用來存電話更好


我一般用時間戳。。。。


oracle 肯定是date或者timestamp最好,查詢容易走索引,系統處理時間函數直接用。

像手上的項目,時間轉成20140926000000這種時間戳,時間計算的時候轉來轉去很麻煩。


最差的方案是用varchar,因為如果要對日期進行比較的時候就麻煩了,比如說要找1980/01/01到1982/02/02出生的人,這就用不上索引會走全表掃描,當然你如果只把作為一個顯示用的欄位就無所謂了。用datetime就不會有這個問題,當然還有其他的方法,就是用長整型,可以存unix時間戳,或者就存19800101這種,長整型查詢效率最高,就是要在應用上做點調整。


表示直接number(8)


oracle必然使用date類型來表示出生日期, @夢遺的新娘說的已經很明白了


凡是現實世界的數據,請一律用vchar或者等價的字元型。這不是技術限制,而是現實系統的各種不可預知的約束(各種奇葩需求)所導致的。真實的、用來做計算和比較的欄位,請盡量和用來做輸入和表示的欄位分開。

一定要用日期型的話,請使用不帶time的,因為有時候會涉及到比較,別給自己找麻煩(時分秒等無用數據)。

總之,純日期時間類型,過於理想化,多數情況下不推薦。


推薦閱讀:

可否對比一下 TiDB 與 AWS Aurora ?
大家如何看待類似於達夢資料庫這樣的號稱具有自主知識產權的國產軟體?
MySQL插入「 」字時報錯,請問是什麼原因?
CAP理論和NoSQL的疑問?
主流資料庫哪個最好?哪個現在最火?

TAG:資料庫 |