DATEDIFF (Transact-SQL)
傳回指定的 startdate 和 enddate 之間所跨的指定 datepart 邊界的計數(帶符号的整數)。
有關所有 Transact-SQL 日期和時間資料類型及函數的概述,請參閱日期和時間資料類型及函數 (Transact-SQL)。 有關日期和時間資料類型及函數共有的資訊和示例,請參閱使用日期和時間資料。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZukjMlADMx4CTRNFLuNWLopHOyUiN0ADO1ImNiNjYwMTLmFTO40yYygDNtcDM4QWL2YTMkFjY1AjL0kzN5gTMz12Lc12bj5Cdm92cvJ3Yp1mLuR2ct5Savw1LcpDc0RHaiojIsJye.gif)
Transact-SQL 文法約定
文法
DATEDIFF ( datepart , startdate , enddate )
參數
- datepart
- 是指定所跨邊界類型的 startdate 和 enddate 的一部分。 下表列出了所有有效的 datepart 參數。 使用者定義的變量等效項是無效的。
datepart 縮寫 year yy, yyyy quarter qq, q month mm, m dayofyear dy, y day dd, d week wk, ww hour hh minute mi, n second ss, s millisecond ms microsecond mcs nanosecond ns
- startdate
-
是一個表達式,可以解析為 time、date、smalldatetime、datetime、datetime2 或 datetimeoffset 值。date 可以是表達式、清單達式、使用者定義的變量或字元串文字。從 enddate 減去 startdate。
為避免不确定性,請使用四位數年份。 有關兩位數年份的資訊,請參閱two digit year cutoff 選項。
- enddate
- 請參閱 startdate。
傳回類型
int
傳回值
- 每個 datepart 及其縮寫都傳回相同的值。
如果傳回值超出 int 的範圍(-2,147,483,648 到 +2,147,483,647),則會傳回一個錯誤。 對于 millisecond,startdate 與 enddate 之間的最大內插補點為 24 天 20 小時 31 分鐘 23.647 秒。 對于 second,最大內插補點為 68 年。
如果為 startdate 和 enddate 都隻指定了時間值,并且 datepart 不是時間 datepart,則會傳回 0。
在計算傳回值時不使用 startdate 或 endate 的時區偏移量部分。
由于 smalldatetime 僅精确到分鐘,是以将 smalldatetime 值用作 startdate 或 enddate 時,傳回值中的秒和毫秒将始終設定為 0。
如果隻為某個日期資料類型的變量指定時間值,則所缺日期部分的值将設定為預設值:1900-01-01。 如果隻為某個時間或日期資料類型的變量指定日期值,則所缺時間部分的值将設定為預設值:00:00:00。 如果 startdate 和 enddate 中有一個隻含時間部分,另一個隻含日期部分,則所缺時間和日期部分将設定為各自的預設值。
如果 startdate 和 enddate 屬于不同的日期資料類型,并且其中一個的時間部分或秒的小數部分精度比另一個高,則另一個的所缺部分将設定為 0。
日期部分邊界
以下語句具有相同的 startdate 和相同的 endate。 這些日期是相鄰的,在時間上相差 .0000001 秒。 每個語句中 startdate 與 endate 之間的差跨其 datepart 的一個月曆或時間邊界。 每個語句都傳回 1。如果本例使用不同的年份且 startdate 和 endate 都在相同的月曆周内,則 week 的傳回值将為 0。
SELECT DATEDIFF(year, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(quarter, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(month, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(dayofyear, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(day, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(week, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(hour, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(minute, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(second, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(millisecond, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
備注
DATEDIFF 可用在選擇清單、WHERE、HAVING、GROUP BY 和 ORDER BY 子句中。
----------------------------------------------------我是大膽的分隔線----------------------------------------------------
Sql Server中的日期與時間函數
1. 目前系統日期、時間
select getdate()
2. dateadd 在向指定日期加上一段時間的基礎上,傳回新的 datetime 值
例如:向日期加上2天
select dateadd(day,2,'2004-10-15') --傳回:2004-10-17 00:00:00.000
3. datediff 傳回跨兩個指定日期的日期和時間邊界數。
select datediff(day,'2004-09-01','2004-09-18') --傳回:17
4. datepart 傳回代表指定日期的指定日期部分的整數。
SELECT DATEPART(month, '2004-10-15') --傳回 10
5. datename 傳回代表指定日期的指定日期部分的字元串
SELECT datename(weekday, '2004-10-15') --傳回:星期五
6. day(), month(),year() --可以與datepart對照一下
select 目前日期=convert(varchar(10),getdate(),120)
,目前時間=convert(varchar(8),getdate(),114)
select datename(dw,'2004-10-15')
select 本年第多少周=datename(week,'2004-10-15')
,今天是周幾=datename(weekday,'2004-10-15')
函數 參數/功能
GetDate( ) 傳回系統目前的日期與時間
DateDiff (interval,date1,date2) 以interval 指定的方式,傳回date2 與date1兩個日期之間的內插補點 date2-date1
DateAdd (interval,number,date) 以interval指定的方式,加上number之後的日期
DatePart (interval,date) 傳回日期date中,interval指定部分所對應的整數值
DateName (interval,date) 傳回日期date中,interval指定部分所對應的字元串名稱
參數 interval的設定值如下:
值 縮 寫 (Sql Server) Access 和 ASP 說明
Year Yy yyyy 年 1753 ~ 9999
Quarter Qq q 季 1 ~ 4
Month Mm m 月1 ~ 12
Day of year Dy y 一年的日數,一年中的第幾日 1-366
Day Dd d 日,1-31
Weekday Dw w 一周的日數,一周中的第幾日 1-7
Week Wk ww 周,一年中的第幾周 0 ~ 51
Hour Hh h 時0 ~ 23
Minute Mi n 分鐘0 ~ 59
Second Ss s 秒 0 ~ 59
Millisecond Ms - 毫秒 0 ~ 999
access 和 asp 中用date()和now()取得系統日期時間;其中DateDiff,DateAdd,DatePart也同是能用于Access和asp中,這些函數的用法也類似
舉例:
1.GetDate() 用于sql server :select GetDate()
2.DateDiff('s','2005-07-20','2005-7-25 22:56:32')傳回值為 514592 秒
DateDiff('d','2005-07-20','2005-7-25 22:56:32')傳回值為 5 天
3.DatePart('w','2005-7-25 22:56:32')傳回值為 2 即星期一(周日為1,周六為7)
DatePart('d','2005-7-25 22:56:32')傳回值為 25即25号
DatePart('y','2005-7-25 22:56:32')傳回值為 206即這一年中第206天
DatePart('yyyy','2005-7-25 22:56:32')傳回值為 2005即2005年
----------------------------------------
Sql Server 常用日期格式
釋出于:2006-2-24 17:53:25 已被閱讀: 158
SQL Server中文版的預設的日期字段datetime格式是yyyy-mm-dd Thh:mm:ss.mmm
例如:
select getdate()
2004-09-12 11:06:08.177
整理了一下SQL Server裡面可能經常會用到的日期格式轉換方法:
舉例如下:
select CONVERT(varchar, getdate(), 120 )
2004-09-12 11:06:08
select replace(replace(replace(CONVERT(varchar, getdate(), 120 ),'-',''),' ',''),':','')
20040912110608
select CONVERT(varchar(12) , getdate(), 23 )
2004-09-12
select CONVERT(varchar(12) , getdate(), 111 )
2004/09/12
select CONVERT(varchar(12) , getdate(), 112 )
20040912
select CONVERT(varchar(12) , getdate(), 102 )
2004.09.12
select CONVERT(varchar(12) , getdate(), 101 )
09/12/2004
select CONVERT(varchar(12) , getdate(), 103 )
12/09/2004
select CONVERT(varchar(12) , getdate(), 104 )
12.09.2004
select CONVERT(varchar(12) , getdate(), 105 )
12-09-2004
select CONVERT(varchar(12) , getdate(), 106 )
12 09 2004
select CONVERT(varchar(12) , getdate(), 107 )
09 12, 2004
select CONVERT(varchar(12) , getdate(), 108 )
11:06:08
select CONVERT(varchar(12) , getdate(), 109 )
09 12 2004 1
select CONVERT(varchar(12) , getdate(), 110 )
09-12-2004
select CONVERT(varchar(12) , getdate(), 113 )
12 09 2004 1
select CONVERT(varchar(12) , getdate(), 114 )
11:06:08.177
--------------------------------------------------
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 天
-------------------------------------------------
二、日期/時間函數(可以工作在Select,FROM,Where之間)
1。ADD_MONTHS:将指定的日期增加一個月。
SQL>Select TASK,STARTDATE,ENDDATE orIGNAL_END,ADD_MONTHS(ENDDATE,2)
FROM PROJECT;
2。LAST_DAY:可以傳回指定月份的最後一天。
SQL>Select ENDDATE,LAST_DAY(ENDDATE) FROM PROJECT;
3。MONTHS_BETWEEN:查詢給定2個日期之間有多少個月。
SQL>Select TASK,STARTDATE,ENNDATE,MONTHS_BETWEEN(STARTDATE,ENDDATE) DURATION
FROM PROJECT; (傳回結果是負值).
可以利用負值來判斷某一日期是否在另一個日期之前,
SQL>Select * FROM PROJECT Where MONTHS_BETWEEN ('19 MAY 95',STARTDATE)>0;
4。NEW_TIME:如果你想把時間調整到你所在的時區,你可以使用NEW_TIME,下邊給出了所有時區。
SQL>Select ENDDATE EDT,NEW_TIME (ENDDATE,'EDT','PDT') FROM PROJECT;
5。NEXT_DAY:将傳回與指定日期在同一個星期或之後一個星期内的,你所要求的星期天數的确切日期.如果你想知道你所指定的日期的星期五是幾号,可以這樣:
SQL>Select STARTDATE,NEXT_DAY(STARTDATE,'FRIDAY') FROM PROJECT;
6。SYSDATE:将傳回系統的日期和時間。如:
SQL>Select DISTINCT SYSDAY FROM PROJECT;