SQL中時間函式總結(一)

iSQlServer發表於2009-08-13

①DATEADD\DAY\DATEDIFF\GETDATE\DATENAME等函式的用法. 
②想查詢2007年2月9日的付款流水有單筆交易出現多張小票號的情況的小票號,該用什麼語句? 
提問者: 420329630 - 助理 二級 
最佳答案 
1.DateAdd ( I , N , D ) 
將一個日期加上一段期間後的日期。 I :設定一個日期( Date )所加上的一段期間的單位。譬如 interval="d" 表示 N的單位為日。 I的設定值如下: 
yyyy Year 年 
q Quarter 季 
m Month 月 
d Day 日 
w Weekday 星期 
h Hour 時 
n Minute 分 
s Second 秒 
N :數值表示式,設定一個日期所加上的一段期間,可為正值或負值,正值表示加(結果為 >date 以後的日期),負值表示減(結果為 >date 以前的日期)。 
D :待加減的日期。 
例子: DateAdd ( "m" , 1 , "31-Jan-98") 
結果: 28-Feb-98 
說明:將日期 31-Jan-98 加上一個月,結果為 28-Feb-98 而非 31-Fe-98 。 
例子: DateAdd ( "d" , 20 , "30-Jan-99") 
結果: 1999/2/9 
說明:將一個日期 30-Jan-99 加上 20 天后的日期。 

2.Day( 日期的字串或表示式 ) 
傳回日期的「日」部份。 
例子: Day(" 12/1/1999 ") 
結果: 1 

3.DateDiff (I , D1 , D2[,FW[,FY]]) 
計算兩個日期之間的期間。 
I :設定兩個日期之間的期間計算之單位。譬如 >I="m" 表示計算的單位為月。 >I 的設定值如: 
yyyy > Year 年 
q Quarter 季 
m Month 月 
d Day 日 
w Weekday 星期 
h Hour 時 
n Minute 分 
s Second 秒 
D1 ,D2:計算期間的兩個日期表示式,若 >date1 較早,則兩個日期之間的期間結果為正值;若 >date2 較早, 則結果為負值。 
FW :設定每週第一天為星期幾, 若未設定表示為星期天。 >FW 的設定值如下: 
0 使用 >API 的設定值。 
1 星期天 
2 星期一 
3 星期二 
4 星期三 
5 星期四 
6 星期五 
7 星期六 
FY :設定一年的第一週, 若未設定則表示一月一日那一週為一年的第一週。 >FY 的設定值如下: 
0 使用 >API 的設定值。 
1 一月一日那一週為一年的第一週 
2 至少包括四天的第一週為一年的第一週 
3 包括七天的第一週為一年的第一週 
例子: DateDiff ("d","25-Mar-99 ","30-Jun-99 ") 
結果: 97 
說明:顯示兩個日期之間的期間為 97 天 


想查詢2007年2月9日的付款流水有單筆交易出現多張小票號的情況的小票號 
這個要看一下你的表結構是什麼樣的啊? 
回答者:qqsmalltiger - 助理 二級 3-3 23:45 
評價已經被關閉    目前有 0 個人評價 
       好 
50% (0) 不好 
50% (0) 

其他回答    共 1 條 
DATEADD 
在向指定日期加上一段時間的基礎上,返回新的 datetime 值。 

語法 
DATEADD ( datepart , number, date ) 

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

語法 
DATEDIFF ( datepart , startdate , enddate ) 

GETDATE 
按 datetime 值的 Microsoft® SQL Server? 標準內部格式返回當前系統日期和時間。 

語法 
GETDATE ( ) 

DATENAME 
返回代表指定日期的指定日期部分的字串。 

語法 
DATENAME ( datepart , date ) 



SQL日期計算 
通常,你需要獲得當前日期和計算一些其他的日期,例如,你的程式可能需要判斷一個月的第一天或者最後一天 

。你們大部分人大概都知道怎樣把日期進行分割(年、月、日等),然後僅僅用分割出來的年、月、日等放在幾 

個函式中計算出自己所需要的日期!在這篇文章裡,我將告訴你如何使用DATEADD和DATEDIFF函式來計算出在你 

的程式中可能你要用到的一些不同日期。 
       在使用本文中的例子之前,你必須注意以下的問題。大部分可能不是所有例子在不同的機器上執行的結 

果可能不一樣,這完全由哪一天是一個星期的第一天這個設定決定。第一天(DATEFIRST)設定決定了你的系統 

使用哪一天作為一週的第一天。所有以下的例子都是以星期天作為一週的第一天來建立,也就是第一天設定為7 

。假如你的第一天設定不一樣,你可能需要調整這些例子,使它和不同的第一天設定相符合。你可以通過 

@@DATEFIRST函式來檢查第一天設定。 

       為了理解這些例子,我們先複習一下DATEDIFF和DATEADD函式。DATEDIFF函式計算兩個日期之間的小時、 

天、周、月、年等時間間隔總數。DATEADD函式計算一個日期通過給時間間隔加減來獲得一個新的日期。要了解 

更多的DATEDIFF和DATEADD函式以及時間間隔可以閱讀微軟聯機幫助。 

       使用DATEDIFF和DATEADD函式來計算日期,和本來從當前日期轉換到你需要的日期的考慮方法有點不同。 

你必須從時間間隔這個方面來考慮。比如,從當前日期到你要得到的日期之間有多少時間間隔,或者,從今天到 

某一天(比如1900-1-1)之間有多少時間間隔,等等。理解怎樣著眼於時間間隔有助於你輕鬆的理解我的不同的 

日期計算例子。 

一個月的第一天 

       第一個例子,我將告訴你如何從當前日期去這個月的最後一天。請注意:這個例子以及這篇文章中的其 

他例子都將只使用DATEDIFF和DATEADD函式來計算我們想要的日期。每一個例子都將通過計算但前的時間間隔, 

然後進行加減來得到想要計算的日期。 

       這是計算一個月第一天的SQL 指令碼: 
       SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) 

       我們把這個語句分開來看看它是如何工作的。最核心的函式是getdate(),大部分人都知道這個是返回當 

前的日期和時間的函式。下一個執行的函式DATEDIFF(mm,0,getdate())是計算當前日期和“1900-01-01 

00:00:00.000”這個日期之間的月數。記住:時期和時間變數和毫秒一樣是從“1900-01-01 00:00:00.000”開 

始計算的。這就是為什麼你可以在DATEDIFF函式中指定第一個時間表示式為“0”。下一個函式是DATEADD,增加 

當前日期到“1900-01-01”的月數。通過增加預定義的日期“1900-01-01”和當前日期的月數,我們可以獲得這 

個月的第一天。另外,計算出來的日期的時間部分將會是“00:00:00.000”。 

       這個計算的技巧是先計算當前日期到“1900-01-01”的時間間隔數,然後把它加到“1900-01-01”上來 

獲得特殊的日期,這個技巧可以用來計算很多不同的日期。下一個例子也是用這個技巧從當前日期來產生不同的 

日期。 

本週的星期一 

       這裡我是用周(wk)的時間間隔來計算哪一天是本週的星期一。 

       SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0) 

一年的第一天 

       現在用年(yy)的時間間隔來顯示這一年的第一天。 

       SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0) 

季度的第一天 

       假如你要計算這個季度的第一天,這個例子告訴你該如何做。 

       SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0) 

當天的半夜 

       曾經需要通過getdate()函式為了返回時間值截掉時間部分,就會考慮到當前日期是不是在半夜。假如這 

樣,這個例子使用DATEDIFF和DATEADD函式來獲得半夜的時間點。 

       SELECT DATEADD(dd, DATEDIFF(dd,0,getdate()), 0) 

深入DATEDIFF和DATEADD函式計算

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

相關文章