天天看點

sql中的日期計算 網上搜集

提到SQL中的日期函數與時間函數就不得不說出以下兩個概念:确定性函數與非确定性函數。

确定性函數:即獲得的值是在一組既定的值中,或者是可以料想到的值。

非确定性函數:即無法準确獲知其結果。

下面将日期函數與時間函數按上面提到的這兩種類型進行分類說明:

1 . 确定性函數:

[1] DateAdd()

作用:在指定的日期加上一段時間的基礎上,傳回新的DateTime

文法:

DateAdd(datepart, number, date)

參數:

datepart

是規定應向日期的哪一部分傳回新值的參數。下表列出了 Microsoft® SQL Server™ 識别的日期部分和縮寫。

number

是用來增加datepart的值,如果指定的不是一個整數,則将舍棄此值的小數部分。

例如,如果為datepart指定day,為number指定1.75,則day将增加1。

date

是傳回DateTime類型或SmallDateTime值或日期格式字元串的表達式。

傳回值類型:

傳回DateTime,如果date參數是SmallDateTime,傳回SmallDateTime。

示例:

此示例列印出目前時間加上21天,

DateAdd(day, 21, GetDate())

number傳負數,大于本月剩餘天數的值都是可以的,函數會自己演算。

[2] DateDiff()

作用:

傳回跨兩個指定日期的日期和時間邊界數。

DateDiff(datepart, startDate, endDate)

DateAdd()中以對此參數進行了介紹,這裡不再贅述,後面的datepart參數也同。

startDate

是計算的開始日期,startDate是傳回DateTime或SmallDateTime值或日期格式字元串的表達式。

因為SmallDateTime隻精确到分鐘,是以當用SmallDateTime時,秒和毫秒總是0。

endDate

是計算的總是日期。endDate是傳回DateTime或SmallDateTime值或日期格式字元串的表達式。

int

解釋:

startDate是從endDate減去。如果startDate比endDate玩,傳回負值。

當超出整數值範圍,DateDiff産生錯誤。

對于毫秒,最大數是24天20小時31分鐘零23.647秒。

對于秒,最大數是68年。

計算跨分鐘、秒和毫秒這些邊界的方法,使得DateDiff給出的結果在全部資料類型中是一緻的。

結果是帶正負号的整數值,其等于跨第一個和第二個日期間的datepart邊界值。

例如,在1月4日(星期日)和1月11日(星期日)之間的星期數是1。

select DateDiff(day, '2009-10-24', GetDate())

[3] Day()

傳回代表指定日期的天的日期部分整數。

Day(date)

類型為DateTime或SmallDateTime的表達式。

此函數等價于DatePart(dd, date)

下面的示例從2009-10-4中傳回day部分

select Day('2009-10-4')

會得到4,即日期部分

[4] Month()

傳回代表指定日期月份的整數。

Month(date)

傳回DateTime或SmallDateTime值或日期格式字元串的表達式。

此函數等價于等價于DatePart(mm, date)

下面的示例從2009-10-4中傳回month部分

select Month('2009-10-4')

會獲得10,即月份部分

[5] Year()

傳回表示指定日期中的年份的整數。

Year(date)

DateTime或SmallDateTime類型的表達式。

此函數等價于DatePart(yy, date)

下例從日期2009-10-4中傳回年分數

select Year('2009-10-4')

獲得2009,即年份部分

2 . 非确定性函數:

[1] DateName()

傳回代表指定日期的制定日期部分的字元串。

DateName(datepart, date)

同DateAdd()

nvarchar

SQL Server自動在字元和DateTime值間按需求進行交換,例如,當字元與DateTime值進行比較時。

此示例從GetDate傳回的日期中提取月份名,

select DateName(month, GetDate())

獲得October

[2] GetDate()

按DateTime值的 Microsoft® SQL Server™ 标準内部格式傳回目前系統日期和時間。

GetDate()

DateTime

日期函數可以用在select語句的選擇清單或用在查詢的where子句中,

在設計報表時,GetDate函數可用于在每次生成報表時列印目前日期和時間。

GetDate對于跟蹤活動也很有用,諸如在記錄事務在某一賬戶上發生的時間。

A. 用GetDate傳回目前日期和日期和時間

下面的示例得出目前系統日期和時間:

select GetDate()

B. 在create table語句中使用GetDate

下面的示例建立Employees表并用GetDate給出員工雇傭時間的預設值。

use Test

go

create table Employees (

)

[3] GetUtcDate()

傳回表示目前UTC時間(世界時間坐标或稱格林威治标準時間)的DateTime值。

目前的UTC時間得自目前的本地時間和運作SQL Server的計算機作業系統中的設定。

GetUtcDate()

GetUtcDate是非确定性函數。引用該列的視圖和表達式無法進行索引。

GetUtcDate無法在使用者定義的函數内使用。

最後的這個比較特别,它是DatePart()

除了用作DatePart(dw, date)外都具有确定性。

dw是工作日的日期部分。

傳回代表指定日期的指定日期部分的函數。

DatePart(datepart, date)

這裡多了個weekday(dw),傳回對應于星期中某天的數,

例如,Sunday = 1,Saturday = 7。

weekday日期部分産生的數取決于set datefirst設定的值,此指令設定星期中的第一天。

是傳回DateTime或SmallDateTime值或日期格式字元串的表達式。

Day、Month和Year函數分别等價于DatePart(dd, date)、DatePart(mm, date)和DatePart(yy, date)

GetDate函數傳回目前日期,然而,比較時并不總是需要完整的日期資訊,通常隻是對日期的一部分進行比較。

select DatePart(mm, GetDate()) as 'Month Num'

獲得10