日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sql,dateadd,datediff

發布時間:2023/11/29 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sql,dateadd,datediff 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文轉載自MSDN,為了方便訪問,謝謝!

DATEADD (Transact-SQL)

http://msdn.microsoft.com/zh-cn/library/ms186819.aspx

將指定 number 時間間隔(有符號整數)與指定 date 的指定 datepart 相加后,返回該 date。

有關所有 Transact-SQL 日期和時間數據類型及函數的概述,請參閱日期和時間數據類型及函數 (Transact-SQL)。有關日期和時間數據類型及函數共有的信息和示例,請參閱使用日期和時間數據。

Transact-SQL 語法約定

?語法

DATEADD (datepart , number, date )
datepart

是與 integer number 相加的 date 部分。下表列出了所有有效的 datepart 參數。用戶定義的變量等效項是無效的。

datepart 縮寫

year

yy, yyyy

quarter

qq, q

month

mm, m

dayofyear

dy, y

day

dd, d

week

wk, ww

weekday

dw, w

hour

hh

minute

mi, n

second

ss, s

millisecond

ms

microsecond

mcs

nanosecond

ns

number

是一個表達式,可以解析為與 date 的 datepart 相加的 int。用戶定義的變量是有效的。

如果您指定一個帶小數的值,則將小數截去且不進行舍入。

date

是一個表達式,可以解析為 time、date、smalldatetime、datetime、datetime2 或 datetimeoffset 值。date 可以是表達式、列表達式、用戶定義的變量或字符串文字。如果表達式是字符串文字,則它必須解析為一個 datetime 值。為避免不確定性,請使用四位數年份。有關兩位數年份的信息,請參閱 two digit year cutoff 選項。

?返回類型

返回數據類型為 date 參數的數據類型,字符串文字除外。

字符串文字的返回數據類型為 datetime。如果字符串文字的秒數小數位數超過三位 (.nnn) 或包含時區偏移量部分,將引發錯誤。

?返回值

datepart 參數

dayofyear、day 和 weekday 返回相同的值。

每個 datepart 及其縮寫都返回相同的值。

如果 datepart 為 month 且 date 月份比返回月份的天數多,因而 date 中的日在返回月份中不存在,則返回返回月份的最后一天。例如,9 月份有 30 天;因此,下面兩個語句返回 2006-09-30 00:00:00.000:

SELECT DATEADD(month, 1, '2006-08-30')

SELECT DATEADD(month, 1, '2006-08-31')

number 參數

number 參數不能超出 int 的范圍。在下面的語句中,number 的參數超出 int 范圍 1。將返回如下錯誤消息:“將表達式轉換為數據類型 int 時出現算術溢出錯誤。”

復制代碼
SELECT DATEADD(year,2147483648, '2006-07-31');
SELECT DATEADD(year,-2147483649, '2006-07-31');

date 參數

date 參數不能增加至其數據范圍之外的值。在下面的語句中,與 date 值相加的 number 值超出了 date 數據類型的范圍。將返回如下錯誤消息:“將值添加到 'datetime' 列導致溢出。”

復制代碼
SELECT DATEADD(year,2147483647, '2006-07-31');
SELECT DATEADD(year,-2147483647, '2006-07-31');

date 為 smalldatetime 型、datepart 為秒或秒小數部分時的返回值

smalldatetime 值的秒數部分始終為 00。如果 date 的數據類型為 smalldatetime,則適用以下準則:

  • 如果 datepart 為 second 且 number 介于 -30 和 +29 之間,則不執行加法。
  • 如果 datepart 為 second 且 number 小于 -30 或大于 +29,則以一分鐘為起值執行加法。
  • 如果 datepart 為 millisecond 且 number 介于 -30001 和 +29998 之間,則不執行加法。
  • 如果 datepart 為 millisecond 且 number 小于 -30001 或大于 +29998,則以一分鐘為起值執行加法。
?備注

DATEADD 可用在 SELECT <list>、WHERE、HAVING、GROUP BY 和 ORDER BY 子句中。

秒的小數部分精度

不允許將日期部分 microsecond 或 nanosecond 與數據類型為 smalldatetime、date 和 datetime 的 date 相加。

毫秒的小數位數為 3 (.123)。微秒的小數位數為 6 (.123456)。納秒的小數位數為 9 (.123456789)。time、datetime2 和 datetimeoffset 數據類型的最大小數位數為 7 (.1234567)。如果 datepart 為 nanosecond,則 number 必須為 100 才能使 date 的秒小數部分增加。介于 1 和 49 之間的 number 向下舍入為 0,介于 50 和 99 之間的 number 向上舍入為 100。

以下語句加的 datepart 為 millisecond、microsecond 或 nanosecond。

復制代碼
DECLARE @datetime2 datetime2 = '2007-01-01 13:10:10.1111111'
SELECT '1 millisecond' ,DATEADD(millisecond,1,@datetime2)
UNION ALL
SELECT '2 milliseconds', DATEADD(millisecond,2,@datetime2)
UNION ALL
SELECT '1 microsecond', DATEADD(microsecond,1,@datetime2)
UNION ALL
SELECT '2 microseconds', DATEADD(microsecond,2,@datetime2)
UNION ALL
SELECT '49 nanoseconds', DATEADD(nanosecond,49,@datetime2)
UNION ALL
SELECT '50 nanoseconds', DATEADD(nanosecond,50,@datetime2)
UNION ALL
SELECT '150 nanoseconds', DATEADD(nanosecond,150,@datetime2);
/*
Returns:
1 millisecond 2007-01-01 13:10:10.1121111
2 milliseconds 2007-01-01 13:10:10.1131111
1 microsecond 2007-01-01 13:10:10.1111121
2 microseconds 2007-01-01 13:10:10.1111131
49 nanoseconds 2007-01-01 13:10:10.1111111
50 nanoseconds 2007-01-01 13:10:10.1111112
150 nanoseconds 2007-01-01 13:10:10.1111113
*/

時區偏移量

不允許對時區偏移量執行加法。

?示例

A. 以 1 為增量遞增 datepart

下面的每條語句以 1 為增量遞增 datepart。

復制代碼
DECLARE @datetime2 datetime2 = '2007-01-01 13:10:10.1111111'
SELECT 'year', DATEADD(year,1,@datetime2)
UNION ALL
SELECT 'quarter',DATEADD(quarter,1,@datetime2)
UNION ALL
SELECT 'month',DATEADD(month,1,@datetime2)
UNION ALL
SELECT 'dayofyear',DATEADD(dayofyear,1,@datetime2)
UNION ALL
SELECT 'day',DATEADD(day,1,@datetime2)
UNION ALL
SELECT 'week',DATEADD(week,1,@datetime2)
UNION ALL
SELECT 'weekday',DATEADD(weekday,1,@datetime2)
UNION ALL
SELECT 'hour',DATEADD(hour,1,@datetime2)
UNION ALL
SELECT 'minute',DATEADD(minute,1,@datetime2)
UNION ALL
SELECT 'second',DATEADD(second,1,@datetime2)
UNION ALL
SELECT 'millisecond',DATEADD(millisecond,1,@datetime2)
UNION ALL
SELECT 'microsecond',DATEADD(microsecond,1,@datetime2)
UNION ALL
SELECT 'nanosecond',DATEADD(nanosecond,1,@datetime2);
/*
Year 2008-01-01 13:10:10.1111111
quarter 2007-04-01 13:10:10.1111111
month 2007-02-01 13:10:10.1111111
dayofyear 2007-01-02 13:10:10.1111111
day 2007-01-02 13:10:10.1111111
week 2007-01-08 13:10:10.1111111
weekday 2007-01-02 13:10:10.1111111
hour 2007-01-01 14:10:10.1111111
minute 2007-01-01 13:11:10.1111111
second 2007-01-01 13:10:11.1111111
millisecond 2007-01-01 13:10:10.1121111
microsecond 2007-01-01 13:10:10.1111121
nanosecond 2007-01-01 13:10:10.1111111
*/

B. 在一條語句中將 datepart 增加一級以上

下面的每條語句將 datepart 與一個足夠大的 number 相加,使得 date 的上一級 datepart 也增大。

復制代碼
DECLARE @datetime2 datetime2;
SET @datetime2 = '2007-01-01 01:01:01.1111111';
--Statement Result
-------------------------------------------------------------------
SELECT DATEADD(quarter,4,@datetime2); --2008-01-01 01:01:01.110
SELECT DATEADD(month,13,@datetime2); --2008-02-01 01:01:01.110
SELECT DATEADD(dayofyear,365,@datetime2); --2008-01-01 01:01:01.110
SELECT DATEADD(day,365,@datetime2); --2008-01-01 01:01:01.110
SELECT DATEADD(week,5,@datetime2); --2007-02-05 01:01:01.110
SELECT DATEADD(weekday,31,@datetime2); --2007-02-01 01:01:01.110
SELECT DATEADD(hour,23,@datetime2); --2007-01-02 00:01:01.110
SELECT DATEADD(minute,59,@datetime2); --2007-01-01 02:00:01.110
SELECT DATEADD(second,59,@datetime2); --2007-01-01 01:02:00.110
SELECT DATEADD(millisecond,1,@datetime2); --2007-01-01 01:01:01.110

C. 使用表達式作為 number 和 date 形參的實參

以下示例使用不同類型的表達式作為 number 和 date 形參的實參。

將列指定為 date

下例將每個 OrderDate 加上 2 天以計算新的 PromisedShipDate。

復制代碼
USE AdventureWorks;
GO
SELECT SalesOrderID
,OrderDate
,DATEADD(day,2,OrderDate) AS PromisedShipDate
FROM Sales.SalesOrderHeader;

將用戶定義的變量指定為 number 和 date

下例將用戶定義的變量指定為 number 和 date 的參數。

復制代碼
DECLARE @days int;
DECLARE @datetime datetime;
SET @days = 365;
SET @datetime = '2000-01-01 01:01:01.111'; /* 2000 was a leap year */
SELECT DATEADD(day, @days, @datetime);

將標量系統函數指定為 date

下例指定 SYSDATETIME 用作 date。

復制代碼
SELECT DATEADD(month, 1, SYSDATETIME());

將標量子查詢和標量函數指定為 number 和 date

下例將標量子查詢和標量函數 MAX(ModifiedDate) 用作 number 和 date 的參數。(SELECT TOP 1 ContactID FROM Person.Contact) 是 number 形參的假實參,用來說明如何從值列表中選擇 number 實參。

復制代碼
USE AdventureWorks;
GO
SELECT DATEADD(month,(SELECT TOP 1 ContactID FROM Person.Contact),
(SELECT MAX(ModifiedDate) FROM Person.Contact));

將常量指定為 number 和 date

下例將數值和字符常量用作 number 和 date 的參數。

SELECT DATEADD(minute, 1, ' 2007-05-07 09:53:01.0376635');

將數值表達式和標量系統函數指定為 number 和 date

下例將數值表達式 (-(10/2))、一元運算符 (-)、算術運算符 (/) 和標量系統函數 (SYSDATETIME) 用作 number 和 date 的參數。

復制代碼
SELECT DATEADD(month,-(10/2), SYSDATETIME());

將排名函數指定為 number

下例將排名函數用作 number 的參數。

復制代碼
USE AdventureWorks;
GO
SELECT c.FirstName, c.LastName
,DATEADD(day,ROW_NUMBER() OVER (ORDER BY
a.PostalCode),SYSDATETIME()) AS 'Row Number'
FROM Sales.SalesPerson s
INNER JOIN Person.Contact c
ON s.SalesPersonID = c.ContactID
INNER JOIN Person.Address a
ON a.AddressID = c.ContactID
WHERE TerritoryID IS NOT NULL
AND SalesYTD <> 0;

將聚合開窗函數指定為 number

下例將聚合開窗函數用作 number 的參數。

復制代碼
USE AdventureWorks;
GO
SELECT SalesOrderID, ProductID, OrderQty
,DATEADD(day,SUM(OrderQty)
OVER(PARTITION BY SalesOrderID),SYSDATETIME()) AS 'Total'
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN(43659,43664);
GO
?請參閱

參考

CAST 和 CONVERT (Transact-SQL)

DATEDIFF (Transact-SQL)

http://msdn.microsoft.com/zh-cn/library/ms189794.aspx

返回指定的 startdate 和 enddate 之間所跨的指定 datepart 邊界的計數(帶符號的整數)。

有關所有 Transact-SQL 日期和時間數據類型及函數的概述,請參閱日期和時間數據類型及函數 (Transact-SQL)。 有關日期和時間數據類型及函數共有的信息和示例,請參閱使用日期和時間數據。

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 子句中。

?示例

以下示例使用不同類型的表達式作為 startdate 和 enddate 形參的實參。

A. 為 startdate 和 enddate 指定列

下例計算一個表的兩列中的日期之間所跨越的日邊界數。

復制代碼
CREATE TABLE dbo.Duration
(
startDate datetime2
,endDate datetime2
)
INSERT INTO dbo.Duration(startDate,endDate)
VALUES('2007-05-06 12:10:09','2007-05-07 12:10:09')
SELECT DATEDIFF(day,startDate,endDate) AS 'Duration'
FROM dbo.Duration;
-- Returns: 1

B. 為 startdate 和 enddate 指定用戶定義的變量

下例使用用戶定義的變量作為 startdate 和 enddate 的參數。

復制代碼
DECLARE @startdate datetime2 = '2007-05-05 12:10:09.3312722';
DECLARE @enddate datetime2 = '2007-05-04 12:10:09.3312722';
SELECT DATEDIFF(day, @startdate, @enddate);

C. 為 startdate 和 enddate 指定標量系統函數

下例使用標量系統函數作為 startdate 和 enddate 的參數。

復制代碼
SELECT DATEDIFF(millisecond, GETDATE(), SYSDATETIME());

D. 為 startdate 和 enddate 指定標量子查詢和標量函數

下例使用標量子查詢和標量函數作為 startdate 和 enddate 的參數。

復制代碼
USE AdventureWorks;
GO
SELECT DATEDIFF(day,(SELECT MIN(OrderDate) FROM Sales.SalesOrderHeader),
(SELECT MAX(OrderDate) FROM Sales.SalesOrderHeader));

E. 為 startdate 和 enddate 指定常量

下例使用字符常量作為 startdate 和 enddate 的參數。

復制代碼
SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635'
, '2007-05-08 09:53:01.0376635');

F. 為 enddate 指定數值表達式和標量系統函數

下例使用數值表達式 (GETDATE ()+ 1) 和標量系統函數 GETDATE 與 SYSDATETIME 作為 enddate 的參數。

注意:
SYSDATETIME、SYSUTCDATETIME 和 SYSDATETIMEOFFSET 不能作為算術表達式的一部分。

復制代碼
USE AdventureWorks;
GO
SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635', GETDATE()+ 1)
AS NumberOfDays
FROM Sales.SalesOrderHeader;
GO
USE AdventureWorks;
GO
SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635', DATEADD(day,1,SYSDATETIME())) AS NumberOfDays
FROM Sales.SalesOrderHeader;
GO

G. 為 startdate 指定排名函數

下例使用排名函數作為 startdate 的參數。

復制代碼
USE AdventureWorks;
GO
SELECT c.FirstName, c.LastName
,DATEDIFF(day,ROW_NUMBER() OVER (ORDER BY
a.PostalCode),SYSDATETIME()) AS 'Row Number'
FROM Sales.SalesPerson s
INNER JOIN Person.Contact c
ON s.SalesPersonID = c.ContactID
INNER JOIN Person.Address a
ON a.AddressID = c.ContactID
WHERE TerritoryID IS NOT NULL
AND SalesYTD <> 0;

H. 為 startdate 指定聚合開窗函數

下例使用聚合開窗函數作為 startdate 的參數。

復制代碼
USE AdventureWorks;
GO
SELECT soh.SalesOrderID, sod.ProductID, sod.OrderQty,soh.OrderDate
,DATEDIFF(day,MIN(soh.OrderDate)
OVER(PARTITION BY soh.SalesOrderID),SYSDATETIME() ) AS 'Total'
FROM Sales.SalesOrderDetail sod
INNER JOIN Sales.SalesOrderHeader soh
ON sod.SalesOrderID = soh.SalesOrderID
WHERE soh.SalesOrderID IN(43659,58918);
GO
?請參閱

參考

CAST 和 CONVERT (Transact-SQL)

總結

以上是生活随笔為你收集整理的sql,dateadd,datediff的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。