日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
T-SQLProgramming:DateTimeDataTypePart2

上文中我們介紹了DateTime的存儲(chǔ)格式,以及如何使用DateTime;本文主要講述DateTime類(lèi)型四舍五入的問(wèn)題。 

2. DateTime類(lèi)型四舍五入問(wèn)題(rounding issues)

DateTime 與 String 之間的轉(zhuǎn)換并總是精確的。例如,“20060923 03:23:47:001” 轉(zhuǎn)換為DateTime類(lèi)型時(shí),此項(xiàng)將會(huì)轉(zhuǎn)換為離百分之三秒最近的時(shí)間。那將會(huì)轉(zhuǎn)換為“20060923 03:23:47.000”。為什么轉(zhuǎn)換結(jié)果是這樣呢?  是由于數(shù)據(jù)總是被轉(zhuǎn)換為 離 3/1000秒為計(jì)算單位的最近的時(shí)間。(那我們是否可以這樣理解這次轉(zhuǎn)換呢?其實(shí),這次轉(zhuǎn)換涉及到的結(jié)果可以是 .000 和 .003 ,依據(jù)離3/1000秒最近的原則,.001 到.000為1毫秒 .001 到.003 是2毫秒,所以結(jié)果是.000).上述的字符串如果轉(zhuǎn)換為Smalldatetime類(lèi)型時(shí),結(jié)果將會(huì)是"20060923 03:24:00". 轉(zhuǎn)換為SmallDateTime時(shí),總是將結(jié)果轉(zhuǎn)換為離 分為計(jì)算單位最近的時(shí)間。(可以這樣理解,03:23:47 轉(zhuǎn)換為SmallDateTime時(shí),可以轉(zhuǎn)換為 03:23:00 和 03:24:00 由這兩個(gè)結(jié)果可以知道,轉(zhuǎn)換字符離03:24:00 只有13秒,所以轉(zhuǎn)換為 03:24:00.)那如果轉(zhuǎn)換字符分別為 “?03:23:30 ” 和“03:23:29”時(shí),轉(zhuǎn)換結(jié)果是什么呢?結(jié)果為“03:24:00” 和“03:23:00”。

同樣,當(dāng)String 類(lèi)型轉(zhuǎn)換為DateTime時(shí),結(jié)果也是不精確的。String類(lèi)型的值會(huì)被轉(zhuǎn)換為最接近的DateTime類(lèi)型值。而不會(huì)向Decimal類(lèi)型的值向INT類(lèi)型的轉(zhuǎn)換,只是簡(jiǎn)單的將后續(xù)的小數(shù)部分去掉,如10.99轉(zhuǎn)換結(jié)果為10。DateTim數(shù)據(jù)的毫秒部分總是遵循以下的格式,[0-9][0-9][037]。例如,毫秒部分的值為994時(shí),在轉(zhuǎn)換為DateTime類(lèi)型時(shí),最終的結(jié)果將會(huì)是997. 999將會(huì)轉(zhuǎn)換為下一秒的000。因此,對(duì)于如下的語(yǔ)句而言,這就不是一個(gè)很好的過(guò)濾語(yǔ)句:

Where Dt  between '20060211 00:00:00.000'  and  '20060211 23:59:59.999' .為什么呢?通過(guò)以上分析可知,'20060211 23:59:59.999' 將會(huì)轉(zhuǎn)換為'20060212 00:00:00.000'。 因此根據(jù)上述條件,最終的結(jié)果中將會(huì)包含  '20060212 00:00:00.000' 的數(shù)據(jù)。為了改進(jìn)上面的內(nèi)容,我們可以將上邊界的值改為'20060211 23:59:59.997'。這樣就不會(huì)包含 '20060212 00:00:00.000'    的數(shù)據(jù)了。更好的條件使用方法,如下所示:

Where Dt >= '20060211 00:00:00.000' and Dt<'20060212 00:00:00.000'  .這種寫(xiě)法無(wú)論DateTime類(lèi)型還是SmallDateTime類(lèi)型,都能夠正常使用。 

一些程序員在使用上面的 Dt >= '20060211 00:00:00.000' and Dt<'20060212 00:00:00.000'  時(shí),喜歡去掉時(shí)間部分,寫(xiě)成如下的形式:

 Dt >= '20060211' and Dt<'20060212'  在這種形式下,SQL Server 將會(huì)將字符形式轉(zhuǎn)換為指定日期的午夜時(shí)間。即 '20060211' 轉(zhuǎn)換為 20060211 00:00:00.000.

上面的過(guò)濾條件是 Search Argument(SARG),這就意味著查詢優(yōu)化器會(huì)考慮使用索引的查詢操作提高性能。但是有些人會(huì)寫(xiě)成如下的形式,使用SQL Server函數(shù)將日期部分取出來(lái),再進(jìn)行比較,如下:

Where Convert(Varchar(8),dt,112)='20060211' 這種寫(xiě)法不是SARG形式,數(shù)據(jù)庫(kù)不會(huì)使用索引查詢,因此,應(yīng)當(dāng)避免此種寫(xiě)法。

原文鏈接:http://www.cnblogs.com/fisher3/archive/2011/03/31/1998179.html


分享名稱:T-SQLProgramming:DateTimeDataTypePart2
網(wǎng)址分享:http://www.dlmjj.cn/article/cdhpiog.html