你可以明白,通過使用簡單的DATEDIFF和DATEADDFunction Compute,你可以發現很多不同的可能有意義的日期。
目前為止的所有例子只是僅僅計算當前的時間和“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和DATEDIFFFunction Compute日期時給你一點啟發。通過使用這個計算日期的
時間間隔的數學方法,我發現為了顯示兩個日期之間間隔的有用曆法是有價值的。注意,這隻是計算出這些日期
的一種方法。要牢記,還有很多方法可以得到相同的計算結果。假如你有其他的方法,那很不錯,要是你沒有,
我希望這些例子可以給你一些啟發,當你要用DATEADD和DATEDIFFFunction Compute你程式可能要用到的日期時。
---------------------------------------------------------------
附錄,其他日期處理方法
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)