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