你可以明白,通過使用簡單的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)
SQL時間函式總結(二)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-612109/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL中時間函式總結(一)SQL函式
- Sql時間函式SQL函式
- SQL Server函式總結SQLServer函式
- T-SQL——函式——時間操作函式SQL函式
- SQL SERVER 時間和日期函式SQLServer函式
- Sql Server函式全解(4):日期和時間函式SQLServer函式
- Sql Server函式全解(四)日期和時間函式SQLServer函式
- Sql Server系列:日期和時間函式SQLServer函式
- MySQL日期和時間函式彙總MySql函式
- 常用的PB時間函式彙總函式
- Oracle中的時間函式用法(to_date、to_char) (總結)Oracle函式
- 常用函式--時間函式函式
- SQL Server 裡的日期和時間函式SQLServer函式
- sql 獲取系統時間的函式。SQL函式
- DB2 時間函式小結 .DB2函式
- 時間函式函式
- SQL 10 函式 3 日期時間函式 - 5 計算日期差額SQL函式
- PHP 時間函式PHP函式
- 日期時間函式函式
- oracle時間函式Oracle函式
- MySQL時間函式MySql函式
- Golang時間函式及測試函式執行時間案例Golang函式
- python中關於時間和日期函式的常用計算總結Python函式
- vue.js 實踐總結(二)Render 函式Vue.js函式
- php函式總結PHP函式
- Oracle 函式總結Oracle函式
- ORACLE中日期和時間函式彙總(轉載)Oracle函式
- java 定時任務 quartz 時間表示式Cron總結Javaquartz
- SQL語句中聚合函式忽略NULL值的總結SQL函式Null
- oracle 時間函式sysdateOracle函式
- Oracle 時間函式NumToYMInterval()Oracle函式
- 時間函式對比函式
- Teradata 時間函式函式
- 時間處理函式函式
- mysql時區與時間函式MySql函式
- STL區間成員函式及區間演算法總結函式演算法
- to_date函式與當前系統時間格式可否隱式轉換問題總結函式
- SQL SERVER 日期和時間資料型別及函式 (Transact-SQL)SQLServer資料型別函式