数据库中存储日期的字段类型究竟应该用varchar还是datetime ?
? ? ? ?背景:
? ? ? ?前段時間在百度經驗看到一篇文章《如何在電腦右下角顯示你(愛人)的名字》,之前也聽過這個小技巧,但沒真正動手設置過。所以出于好奇就實踐了一下。
? ? ? 設置完成后的效果例如以下。右下角的時間區域添加了我的名字 “Danny” :
? ? ??
? ? ? 以上為背景。
沒想到這個小技巧給我帶來了麻煩(當然也是一次學習和提高的機會)。
? ? ??該字符串未被識別偽有效的DateTime
? ? ? ?正在做的新聞公布系統。數據庫中存儲時間的字段類型為datetime類型,而且字段值都是在server端自己主動獲取的。想在client以“yyyy-MM-dd HH:mm:ss”的格式顯示時間時,出現了一個問題:“該字符串未被識別偽有效的DateTime”:
? ? ? ? ?錯誤頁面例如以下圖:
? ? ? ? ?
? ? ? ? 獲取異常,異常提示為:
? ? ? ? ?
? ? ? ? 出錯關鍵代碼為:? ??
lblCreateTime.Text = Convert.ToDateTime(news.CreateTime).ToString(); //【注】:lblCreate為前端顯示頁面一個Lable;news為查詢后得到的“新聞”實體類,CreateTime為它的一個字段
? ? ? ? 推測是我本機電腦時間格式的問題,在client獲取了一下時間news.CreateTime的值,格式為:“2014/8/23 星期六 Danny 13:10:14”。而該條記錄的時間在數據庫中存儲的值為 “2014-08-2313:10:14”。經過測試,假設news.CreateTime在數據庫中存儲的類型為varchar(),則不會產生此錯誤。
于是能夠知道。這里時間格式轉化的過程是這種:
? ? ? ? ?
? ? ? ? 在這個過程中。系統推斷出從數據庫中獲取到的值為datetime類型,所以要將獲取到的值(比方這里從數據庫中獲取的時間值為“2014-08-2313:10:14”)轉化為本機的時間格式(比方我電腦的時間格式“2014/8/23 星期六 Danny13:10:14”),在進行最后一步格式轉化時,系統則無法識別用戶自己定義的時間格式(比方這里的“2014/8/23 星期六 Danny13:10:14”),從而報錯。
? ? ? ??在網上找了兩篇總結Asp.net中時間格式轉化的文章:asp.net 格式化時間日期、Asp.net中時間格式化的幾種方法。
這么多種方法。大體上我把它分為兩個方式:在界面代碼(*.aspx)上轉換 & 在后臺代碼(*.aspx.cs)上轉換。
? ? ? ? ?解決方法
? ? ? ? ?解決問題用了兩個辦法:
? ? ? ? 1、假設數據庫中存儲時間的數據類型為datetime。那就避免在后臺代碼(*.aspx.cs)中轉化時間格式,將格式轉化的任務放到界面代碼(*.aspx)上。
? ? ? ? 比方上面的樣例中,不管獲取的時間是什么格式的,在后臺不要對這個時間的值進行不論什么操作(比方賦值等,否則系統會將時間隱式轉換),而是直接在界面代碼(*.aspx)用DataBinder、Eval等方法來直接進行格式化:
? ? ? ? 后臺關鍵代碼:?? ?
<span style="white-space:pre"> </span>DataTable dt = new NewsManager().SelectById(newsid); //這里得到的dt為從直接數據庫中查詢到的數據<span style="white-space:pre"> </span> repNews.DataSource =dt;repNews.DataBind();? ? ? ? 前臺關鍵代碼:
<span style="white-space:pre"> </span><asp:Repeater ID="repNews" runat="server"><ItemTemplate><p class="con_time">公布時間: <%# DataBinder.Eval(Container.DataItem,"createTime","{0:yyyy-MM-dd HH:mm:ss}") %> <%--此處createTime為上面dt中的字段名--%></p></ItemTemplate></asp:Repeater>
? ? ? ? 事實上。大部分系統中的時間格式。那些格式轉化函數還是“認識”的,但假如有的將自己的系統時間格式設置為“2014/8/23 星期六Danny?13:10:14”。有的設置為“2014/8/23 星期六胡玉洋?13:10:14”……,這些函數肯定猜不到那么多中自己定義的情況。
? ? ? ? 所以,在設計軟件的過程中。最好把client這個因素刨除在外,保證各種使用環境的兼容性,時間在數據庫中產生。相同顯示時也僅僅顯示數據庫中的時間(避免client的過濾)。
? ? ? ? 2、將數據庫中存儲時間的數據類型改為varchar(),只是這時最好讓這些時間是數據庫中自己主動生成的(一個沒有格式的輸入也可能會導致輸出錯誤),由于存儲類型為varchar()。所以獲取到的值也就被覺得是一個字符串。這時在轉換時間格式時就少了上圖中【將獲取的時間轉化為client時間格式下的值】的步驟,直接將數據庫中的時間字符串進行轉化(這時那些轉化函數是能識別數據庫中的時間函數的),client的時間格式不再影響轉換過程。
? ? ? ? 只是數據庫中存儲時間的類型假設為字符型也會帶來一些麻煩:
? ? ? ? 數據庫中的時間不過用來顯示、查找的,那么影響還不算大,但假設對時間字段進行一些算法如計算星期、DateDiff、DateAdd等,那就麻煩了,尤事實上在大型數據查詢中轉換類型是會影響效率的
? ? ? ? 總結
? ? ? ? 數據庫中存儲日期的字段類型究竟應該用varchar還是datetime ?這兩種方法各有優勢,datetime能夠借用sql函數庫中運算函數,添加了時間在各種運算上的效率;而varchar類型則能夠在字符編碼上顯出優勢。在 存儲的時間將來不須要進行大量計算 的前提下,能夠考慮選擇varchar類型,反之。選擇datetime類型。
? ? ? ??
轉載于:https://www.cnblogs.com/zfyouxi/p/5287045.html
總結
以上是生活随笔為你收集整理的数据库中存储日期的字段类型究竟应该用varchar还是datetime ?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 作业二:了解流行的软件
- 下一篇: Android Studio 提示Err