SQL時間函式總結(二)

iSQlServer發表於2009-08-13

你可以明白,通過使用簡單的DATEDIFF和DATEADD函式計算,你可以發現很多不同的可能有意義的日期。 
       目前為止的所有例子只是僅僅計算當前的時間和“1900-01-01”之間的時間間隔數量,然後把它加到 

“1900-01-01”的時間間隔上來計算出日期。假定你修改時間間隔的數量,或者使用不同的時間間隔來呼叫 

DATEADD函式,或者減去時間間隔而不是增加,那麼通過這些小的調整你可以發現和多不同的日期。 

       這裡有四個例子使用另外一個DATEADD函式來計算最後一天來分別替換DATEADD函式前後兩個時間間隔。 

上個月的最後一天 

       這是一個計算上個月最後一天的例子。它通過從一個月的最後一天這個例子上減去3毫秒來獲得。有一點 

要記住,在Sql Server中時間是精確到3毫秒。這就是為什麼我需要減去3毫秒來獲得我要的日期和時間。 

       SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)) 
      計算出來的日期的時間部分包含了一個Sql Server可以記錄的一天的最後時刻(“23:59:59:997”)的時 

間。 

去年的最後一天 

       連線上面的例子,為了要得到去年的最後一天,你需要在今年的第一天上減去3毫秒。 

       SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)) 

本月的最後一天 

       現在,為了獲得本月的最後一天,我需要稍微修改一下獲得上個月的最後一天的語句。修改需要給用 

DATEDIFF比較當前日期和“1900-01-01”返回的時間間隔上加1。通過加1個月,我計算出下個月的第一天,然後 

減去3毫秒,這樣就計算出了這個月的最後一天。這是計算本月最後一天的SQL指令碼。 

       SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0)) 

本年的最後一天 

       你現在應該掌握這個的做法,這是計算本年最後一天指令碼 

       SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))。 

本月的第一個星期一 

       好了,現在是最後一個例子。這裡我要計算這個月的第一個星期一。這是計算的指令碼。 

         select DATEADD(wk, DATEDIFF(wk,0,                                                       


                               dateadd(dd,6-datepart(day,getdate()),getdate())), 0)               

           

       在這個例子裡,我使用了“本週的星期一”的指令碼,並作了一點點修改。修改的部分是把原來指令碼中 

“getdate()”部分替換成計算本月的第6天,在計算中用本月的第6天來替換當前日期使得計算可以獲得這個月 

的第一個星期一。 

總結 

       我希望這些例子可以在你用DATEADD和DATEDIFF函式計算日期時給你一點啟發。通過使用這個計算日期的 

時間間隔的數學方法,我發現為了顯示兩個日期之間間隔的有用曆法是有價值的。注意,這只是計算出這些日期 

的一種方法。要牢記,還有很多方法可以得到相同的計算結果。假如你有其他的方法,那很不錯,要是你沒有, 

我希望這些例子可以給你一些啟發,當你要用DATEADD和DATEDIFF函式計算你程式可能要用到的日期時。 

--------------------------------------------------------------- 
附錄,其他日期處理方法 

1)去掉時分秒 
declare @ datetime 
set @ = getdate() --'2003-7-1 10:00:00' 
SELECT @,DATEADD(day, DATEDIFF(day,0,@), 0) 

2)顯示星期幾 
select datename(weekday,getdate())   

3)如何取得某個月的天數 
declare @m int 
set @m=2 --月份 
select    datediff(day,'2003-'+cast(@m as varchar)+'-15' ,'2003-'+cast(@m+1    as varchar)+'- 

15') 

另外,取得本月天數 
select    datediff(day,cast(month(GetDate()) as varchar)+'-'+cast(month(GetDate()) as 

varchar)+'-15' ,cast(month(GetDate()) as varchar)+'-'+cast(month(GetDate())+1    as varchar) 

+'-15') 
或者使用計算本月的最後一天的指令碼,然後用DAY函式區最後一天 
SELECT Day(dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))) 

4)判斷是否閏年: 
SELECT case day(dateadd(mm, 2, dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)))) 

when 28 then '平年' else '閏年' end 
或者 
select case datediff(day,datename(year,getdate())+'-02-01',dateadd(mm,1,datename(year,getdate 

())+'-02-01')) 
when 28 then '平年' else '閏年' end 

5)一個季度多少天 
declare @m tinyint,@time smalldatetime 
select @m=month(getdate()) 
select @m=case when @m between 1 and 3 then 1 
                       when @m between 4 and 6 then 4 
                       when @m between 7 and 9 then 7 




sql日期操作 
dump transaction 資料庫 with no_log 

select datename(weekday,getdate())    獲取當天的星期數 
select convert(char(10),getdate(),21) 

cast(@Today+' '+@DutyTime_1 as datetime) 字串組合產生時間型別 

if exists(select 1 from master..sysdatabases where name='example') 判斷是否有記錄存在 


cast( ltrim(str(@thisyear,4))+'-'+ltrim(str(@thismonth,2))+'-'+'21 00:00:00' as datetime) 
1.一個月第一天的 
Select DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) 

2.本週的星期一 
Select DATEADD(wk, DATEDIFF(wk,0,getdate()), 0) 

3.一年的第一天 
Select DATEADD(yy, DATEDIFF(yy,0,getdate()), 0) 

4.季度的第一天 
Select DATEADD(qq, DATEDIFF(qq,0,getdate()), 0) 

5.當天的半夜 
Select DATEADD(dd, DATEDIFF(dd,0,getdate()), 0) 

6.上個月的最後一天 
Select dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)) 

7.去年的最後一天 
Select dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)) 

8.本月的最後一天 
Select dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0)) 

9.本年的最後一天 
Select dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0)) 

10.本月的第一個星期一 
select DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,6-datepart(day,getdate()),getdate())), 0) 

返回當前日期和時間 
通過函式GETDATE(),你可以獲得當前的日期和時間。函式GETDATE()可以用來作為DATEDIME型欄位的預設值。這對插入記錄時儲存當時的時間是有用的。要建立一個表,其中的記錄包含有當前的日期和時間,可以新增一個DATETIME型欄位,指定其預設值為函式GETDATE()的返回值,就象這樣: 

Create TABLE site_log ( 
username VARCHAR(40), 
useractivity VARCHAR(100), 
entrydate DATETIME DEFAULT GETDATE()) 

轉換日期和時間 
函式GETDATE()的返回值在顯示時只顯示到秒。實際上,SQL Sever內部時間可以精確到毫秒級(確切地說,可以精確到3.33毫秒)。 
要得到不同格式的日期和時間,你需要使用函式CONVERT()。例如,當下面的這個語句執行時,顯示的時間將包括毫秒:

Select CONVERT(VARCHAR(30),GETDATE(),9) 

注意例子中數字9的使用。這個數字指明瞭在顯示日期和時間時使用哪種日期和時間格式。當這個語句執行時,將顯示如下的日期和時間: 
Nov 30 1997 3:29:55:170AM 
(1 row(s) affected)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-612109/,如需轉載,請註明出處,否則將追究法律責任。

相關文章