在日期轉化過程中,往往會出現一些認人匪夷所思的結果,比如下面這段**:
declare @date datetime
set @date=2007-10-04
select @date
------
結果1905-06-17 00:00:00.000
---------------
這和預期結果2007-10-04有很大差距,具體原因是為什麼呢.原來,在這裡sql server處理@date的時候是把它作為了數字.因為沒有找到單引號,所以就做了減法處理2007-10-4=1993.但1993怎麼又變成1905-06-17呢?
大家都知道sql server是以1900-01-01做為基礎日期的.10月4日20時34分 儲存的長度為八個位元組,日期和日間各用四個位元組儲存,第乙個四位元組儲存自1900-01-01之前或之後的天數,後四個位元組儲存以午夜00:00:00.000後的毫秒數.而此處呢?sql server則把1993看做是在基礎日期上加上1993天,即上面的結果.同樣小數部分也可以換算.不過是換算成時間.比如在1993後面加上0.158即:1993.158.
1993轉換為天,0.158不到一天,則可以換算出毫秒數:24*60*60*1000*0.158,即:13651200.000
select dateadd(ms,13651200,'00:00:00.000')
-------------
結果1900-01-01 03:47:31.200
-------------
再對這個結果加上1993天
select dateadd(day,2007-10-04,dateadd(ms,24*60*60*1000*0.158,'00:00:00.000'))
------------
結果1905-06-17 03:47:31.200
--------------
所以,在定義datetime型別的時候一定要注意加上界定符.另外,在dateadd(day,1.1,getdate())這種寫法中,小數部分是無效的,也不會做四捨五入處理.當然用dateadd(ms,24*60*60*1000*1993.0158,getdate())也是行不通的.因為毫秒計算的最大數為:24天20小時31分23.647秒.用秒的說也只有68年,超過此值則會出錯.
sqlserver2000日期轉換為子符型別
select convert char 20 getdate 120 create proc call zjpp1 asdeclare nf varchar 20 select nf convert char 20 getdate 120 insert into qc check1 nf,flag,...
SQL Server 2000 日誌傳送搭建
基本參考 裡面的內容很全。有以下幾點需要提前做的。用來放置主伺服器的日誌備份的資料夾我們就叫 logfile 錯誤 無法訪問logfile 原因 沒有設定共享的許可權 解決辦法 logfile 裡面只是設定了安全裡面的許可權是不夠的,要需要設定共享裡面的許可權 錯誤 錯誤 14261 指定的 pri...
SQL Server 2000下日期操作的例項
1.顯示本月第一天 select dateadd mm,datediff mm,0,getdate 0 select convert datetime,convert varchar 8 getdate 120 01 120 2.顯示本月最後一天 select dateadd day,1,conve...