DATEDIFF (Transact-SQL)
startdate および enddate で指定された 2 つの日付間の差を、指定された datepart の単位 (符号付き整数) で返します。
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 には、式、列式、ユーザー定義変数、または文字列リテラルを指定できます。この関数では、startdate が enddate から減算されます。こうしたあいまいさを排除するため、4 桁の西暦を使用してください。2 桁の年の詳細については、「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 の精度は分単位までなので、startdate または enddate に smalldatetime 値を使用した場合、戻り値では、秒とミリ秒が常に 0 に設定されます。
日付データ型の変数に時刻値だけが割り当てられた場合、欠落している日付要素の値は既定値である 1900-01-01 に設定されます。時刻型または日付型の変数に日付値だけが割り当てられた場合、欠落している時刻要素の値は既定値である 00:00:00 に設定されます。startdate または enddate のいずれか一方が時刻要素のみで、もう一方が日付要素のみであった場合、欠落している時刻要素と日付要素はそれぞれの既定値に設定されます。
startdate と enddate に対して異なる日付データ型が使用されているとき、一方の時刻要素の数または 1 秒未満の秒の有効桁数が、もう一方のデータ型を超えている場合、欠落している要素は 0 に設定されます。
datepart の差
次の各ステートメントには、すべて同じ startdate と endate が指定されています。2 つの日付は隣接しており、時間的な差は .0000001 秒です。各ステートメントにおける startdate と endate の差は、どの要素をとっても、datepart の 1 単位分となるように配慮されています。いずれのステートメントも戻り値は 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 2008 以降では、DATEDIFF は、文字列リテラルを暗黙的に datetime2 型にキャストします。つまり、DATEDIFF では、日付が文字列として渡される場合に YDM 形式がサポートされなくなりました。YDM 形式を使用するには、文字列を datetime 型または smalldatetime 型に明示的にキャストする必要があります。
例
次の例では、startdate パラメーターと enddate パラメーターの引数として各種の式を使用しています。
A. startdate と enddate に列を指定する
次の例では、テーブルの 2 つの列に日付を格納し、両者の差を日単位で計算しています。
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 AdventureWorks2008R2;
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 に数値式およびスカラー システム関数を指定する
次の例では、enddate の引数として、数値式 (GETDATE ()+ 1) のほか、スカラー システム関数 GETDATE および SYSDATETIME を使用しています。
USE AdventureWorks2008R2;
GO
SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635', GETDATE()+ 1)
AS NumberOfDays
FROM Sales.SalesOrderHeader;
GO
USE AdventureWorks2008R2;
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 AdventureWorks2008R2;
GO
SELECT p.FirstName, p.LastName
,DATEDIFF(day,ROW_NUMBER() OVER (ORDER BY
a.PostalCode),SYSDATETIME()) AS 'Row Number'
FROM Sales.SalesPerson s
INNER JOIN Person.Person p
ON s.BusinessEntityID = p.BusinessEntityID
INNER JOIN Person.Address a
ON a.AddressID = p.BusinessEntityID
WHERE TerritoryID IS NOT NULL
AND SalesYTD <> 0;
H. startdate に集計関数を指定する
次の例では、startdate の引数として集計関数を使用しています。
USE AdventureWorks2008R2;
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