DATEDIFF (Transact-SQL)DATEDIFF (Transact-SQL)

適用対象:Applies to: はいSQL ServerSQL Server (サポートされているすべてのバージョン) yesSQL ServerSQL Server (all supported versions) はいAzure SQL データベースAzure SQL DatabaseYesAzure SQL データベースAzure SQL Database はいAzure SQL Managed InstanceAzure SQL Managed InstanceYesAzure SQL Managed InstanceAzure SQL Managed Instance はいAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics はいParallel Data WarehouseParallel Data WarehouseyesParallel Data WarehouseParallel Data Warehouse適用対象:Applies to: はいSQL ServerSQL Server (サポートされているすべてのバージョン) yesSQL ServerSQL Server (all supported versions) はいAzure SQL データベースAzure SQL DatabaseYesAzure SQL データベースAzure SQL Database はいAzure SQL Managed InstanceAzure SQL Managed InstanceYesAzure SQL Managed InstanceAzure SQL Managed Instance はいAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics はいParallel Data WarehouseParallel Data WarehouseyesParallel Data WarehouseParallel Data Warehouse

この関数は、startdateenddate で指定された 2 つの日付間の差を、指定された datepart 境界の数で (符号付き整数値として) で返します。This function returns the count (as a signed integer value) of the specified datepart boundaries crossed between the specified startdate and enddate.

startdate 値と enddate 値の間のより大きな差を処理する関数については、「DATEDIFF_BIG (Transact-SQL)」を参照してください。See DATEDIFF_BIG (Transact-SQL) for a function that handles larger differences between the startdate and enddate values. Transact-SQLTransact-SQL の日付と時刻のあらゆるデータ型と関数に関する概要については、「日付と時刻のデータ型および関数 (Transact-SQL)」を参照してください。See Date and Time Data Types and Functions (Transact-SQL) for an overview of all Transact-SQLTransact-SQL date and time data types and functions.

トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions

構文Syntax

DATEDIFF ( datepart , startdate , enddate )  

注意

SQL Server 2014 以前の Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.

引数Arguments

datepartdatepart
DATEDIFFstartdateenddate の違いを報告する場合の単位。The units in which DATEDIFF reports the difference between the startdate and enddate. 一般的に使用される datepart の単位には、month または second が含まれます。Commonly used datepart units include month or second.

datepart 値を変数に指定することはできません。また、'month' のように引用符で囲まれた文字列として指定することもできません。The datepart value cannot be specified in a variable, nor as a quoted string like 'month'.

次の表に、すべての有効な datepart 値の一覧を示します。The following table lists all the valid datepart values. DATEDIFF は、datepart の完全名、または一覧にある完全名の省略形のいずれかを受け取ります。DATEDIFF accepts either the full name of the datepart, or any listed abbreviation of the full name.

datepartdatepart name datepart 省略形datepart abbreviation
yearyear yy、yyyyyy, yyyy
quarterquarter qq, qqq, q
monthmonth mm, mmm, m
dayofyeardayofyear dy、ydy, y
dayday dd, ddd, d
weekweek wk、wwwk, ww
hourhour hhhh
minuteminute mi、nmi, n
secondsecond ss, sss, s
millisecondmillisecond msms
microsecondmicrosecond mcsmcs
nanosecondnanosecond nsns
   

注意

特定の各 datepart 名と、その datepart 名の省略形では、同じ値が返されます。Each specific datepart name and abbreviations for that datepart name will return the same value.

startdatestartdate
次のいずれかの値に解決できる式。An expression that can resolve to one of the following values:

  • datedate
  • datetimedatetime
  • datetimeoffsetdatetimeoffset
  • datetime2datetime2
  • smalldatetimesmalldatetime
  • timetime

4 桁の西暦を使用して、あいまいさを排除します。Use four-digit years to avoid ambiguity. 2 桁の西暦値については、「two digit year cutoff サーバー構成オプションの構成」を参照してください。See Configure the two digit year cutoff Server Configuration Option for information about two-digit year values.

enddateenddate
startdate」をご覧ください。See startdate.

戻り値の型Return Type

intint

戻り値Return Value

datepart により設定された境界に表示された、startdateenddate の間の int 差。The int difference between the startdate and enddate, expressed in the boundary set by datepart.

たとえば、SELECT DATEDIFF(day, '2036-03-01', '2036-02-28'); からは -2 が返されます。2036 はうるう年である必要があることを示します。For example, SELECT DATEDIFF(day, '2036-03-01', '2036-02-28'); returns -2, hinting that 2036 must be a leap year. この場合、startdate '2036-03-01' から開始し、-2 日をカウントすると、'2036-02-28' の enddate に達することを意味します。This case means that if we start at startdate '2036-03-01', and then count -2 days, we reach the enddate of '2036-02-28'.

int の範囲 (-2,147,483,648 から +2,147,483,647) を超える戻り値の場合、DATEDIFF はエラーを返します。For a return value out of range for int (-2,147,483,648 to +2,147,483,647), DATEDIFF returns an error. millisecond の場合、startdateenddate の差の最大値は 24 日 20 時間 31 分 23.647 秒です。For millisecond, the maximum difference between startdate and enddate is 24 days, 20 hours, 31 minutes and 23.647 seconds. second の場合は、差の最大値は 68 年 19 日 3 時間 14 分 7 秒です。For second, the maximum difference is 68 years, 19 days, 3 hours, 14 minutes and 7 seconds.

startdateenddate の両方に時刻値のみが割り当てられており、datepart が時刻の datepart でない場合、DATEDIFF は 0 を返します。If startdate and enddate are both assigned only a time value, and the datepart is not a time datepart, DATEDIFF returns 0.

DATEDIFF では、戻り値を計算するために、startdate または enddate のタイム ゾーン オフセット要素が使用されます。DATEDIFF uses the time zone offset component of startdate or enddate to calculate the return value.

smalldatetime の精度は分単位までなので、startdate または enddatesmalldatetime 値を使用した場合、戻り値では秒とミリ秒が常に 0 に設定されます。Because smalldatetime is accurate only to the minute, seconds and milliseconds are always set to 0 in the return value when startdate or enddate have a smalldatetime value.

日付データ型の変数に時刻値のみが割り当てられている場合、DATEDIFF では、欠落している日付要素の値が既定値である 1900-01-01 に設定されます。If only a time value is assigned to a date data type variable, DATEDIFF sets the value of the missing date part to the default value: 1900-01-01. 時刻データ型または日付データ型の変数に日付値のみが割り当てられている場合、DATEDIFF では、欠落している時刻要素の値が既定値である 00:00:00 に設定されます。If only a date value is assigned to a variable of a time or date data type, DATEDIFF sets the value of the missing time part to the default value: 00:00:00. startdate または enddate のいずれか一方が時刻要素のみで、もう一方が日付要素のみであった場合、DATEDIFF では、欠落している時刻要素と日付要素がそれぞれの既定値に設定されます。If either startdate or enddate have only a time part and the other only a date part, DATEDIFF sets the missing time and date parts to the default values.

startdateenddate で異なる日付データ型が使用されており、一方の時刻要素の数または秒の小数部の有効桁数が、もう一方のデータ型を超えている場合、DATEDIFF では、欠落している要素が 0 に設定されます。If startdate and enddate have different date data types, and one has more time parts or fractional seconds precision than the other, DATEDIFF sets the missing parts of the other to 0.

datepart の境界datepart boundaries

次の各ステートメントには、すべて同じ startdateenddate の値が指定されています。The following statements have the same startdate and the same enddate values. これらの日付は隣接しており、時間的な差は 100 ナノ秒 (0.0000001 秒) です。Those dates are adjacent and they differ in time by a hundred nanoseconds (.0000001 second). 各ステートメントにおける startdateenddate の差は、どの要素をとっても、datepart の 1 単位分となるように配慮されています。The difference between the startdate and enddate in each statement crosses one calendar or time boundary of its datepart. いずれのステートメントも 1 を返します。Each statement returns 1.

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');
SELECT DATEDIFF(microsecond, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');

startdateenddate の年の値は異なるが、カレンダー週の値が同じである場合、DATEDIFF では、datepart week に対して 0 を返します。If startdate and enddate have different year values, but they have the same calendar week values, DATEDIFF will return 0 for datepart week.

解説Remarks

DATEDIFF は、SELECT <list>WHEREHAVINGGROUP BYORDER BY 句で使用します。Use DATEDIFF in the SELECT <list>, WHERE, HAVING, GROUP BY and ORDER BY clauses.

DATEDIFF は、文字列リテラルを datetime2 型として暗黙的にキャストします。DATEDIFF implicitly casts string literals as a datetime2 type. つまり、DATEDIFF では、日付が文字列として渡される場合、YDM 形式がサポートされません。This means that DATEDIFF does not support the format YDM when the date is passed as a string. 文字列を明示的にキャストする必要があります、 datetime または smalldatetime YDM 形式を使用する型。You must explicitly cast the string to a datetime or smalldatetime type to use the YDM format.

SET DATEFIRST を指定しても、DATEDIFF には何の影響もありません。Specifying SET DATEFIRST has no effect on DATEDIFF. DATEDIFF では、週の最初の曜日として常に日曜日を使用し、関数が決定的な方法で動作するようにします。DATEDIFF always uses Sunday as the first day of the week to ensure the function operates in a deterministic way.

enddatestartdate の差として int の範囲を超える値が返された場合、DATEDIFFminute 以上の精度でオーバーフローする可能性があります。DATEDIFF may overflow with a precision of minute or higher if the difference between enddate and startdate returns a value that is out of range for int.

Examples

次の例では、startdate パラメーターと enddate パラメーターの引数として、各種の式を使用しています。These examples use different types of expressions as arguments for the startdate and enddate parameters.

A.A. startdate と enddate に列を指定するSpecifying columns for startdate and enddate

この例では、テーブルの 2 つの列に日付を格納し、両者の差を日単位で計算しています。This example calculates the number of day boundaries crossed between dates in two columns in a table.

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.B. startdate と enddate にユーザー定義変数を指定するSpecifying user-defined variables for startdate and enddate

この例では、ユーザー定義変数が startdateenddate の引数として機能します。In this example, user-defined variables serve as arguments for startdate and 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.C. startdate と enddate にスカラー システム関数を指定するSpecifying scalar system functions for startdate and enddate

この例では、startdateenddate の引数としてスカラー システム関数を使用しています。This example uses scalar system functions as arguments for startdate and enddate.

SELECT DATEDIFF(millisecond, GETDATE(), SYSDATETIME());  

D.D. startdate と enddate にスカラー サブクエリおよびスカラー関数を指定するSpecifying scalar subqueries and scalar functions for startdate and enddate

この例では、startdateenddate の引数として、サブクエリとスカラー関数を使用しています。This example uses scalar subqueries and scalar functions as arguments for startdate and enddate.

USE AdventureWorks2012;  
GO  
SELECT DATEDIFF(day,
    (SELECT MIN(OrderDate) FROM Sales.SalesOrderHeader),  
    (SELECT MAX(OrderDate) FROM Sales.SalesOrderHeader));  

E.E. startdate と enddate に定数を指定するSpecifying constants for startdate and enddate

この例では、startdateenddate の引数として文字定数を使用しています。This example uses character constants as arguments for startdate and enddate.

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

F.F. enddate に数値式およびスカラー システム関数を指定するSpecifying numeric expressions and scalar system functions for enddate

この例では、enddate の引数として、数値式 (GETDATE() + 1) のほか、スカラー システム関数 GETDATE および SYSDATETIME を使用しています。This example uses a numeric expression, (GETDATE() + 1), and scalar system functions GETDATE and SYSDATETIME, as arguments for enddate.

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

G.G. startdate に順位付け関数を指定するSpecifying ranking functions for startdate

この例では、startdate の引数として順位付け関数を使用しています。This example uses a ranking function as an argument for startdate.

USE AdventureWorks2012;  
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.H. startdate に集計関数を指定するSpecifying an aggregate window function for startdate

この例では、startdate の引数として集計関数を使用しています。This example uses an aggregate window function as an argument for startdate.

USE AdventureWorks2012;  
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  

I.I. startdate と enddate の差を日付部分の文字列として検索するFinding difference between startdate and enddate as date parts strings

-- DOES NOT ACCOUNT FOR LEAP YEARS
DECLARE @date1 DATETIME, @date2 DATETIME, @result VARCHAR(100);
DECLARE @years INT, @months INT, @days INT,
    @hours INT, @minutes INT, @seconds INT, @milliseconds INT;

SET @date1 = '1900-01-01 00:00:00.000'
SET @date2 = '2018-12-12 07:08:01.123'

SELECT @years = DATEDIFF(yy, @date1, @date2)
IF DATEADD(yy, -@years, @date2) < @date1 
SELECT @years = @years-1
SET @date2 = DATEADD(yy, -@years, @date2)

SELECT @months = DATEDIFF(mm, @date1, @date2)
IF DATEADD(mm, -@months, @date2) < @date1 
SELECT @months=@months-1
SET @date2= DATEADD(mm, -@months, @date2)

SELECT @days=DATEDIFF(dd, @date1, @date2)
IF DATEADD(dd, -@days, @date2) < @date1 
SELECT @days=@days-1
SET @date2= DATEADD(dd, -@days, @date2)

SELECT @hours=DATEDIFF(hh, @date1, @date2)
IF DATEADD(hh, -@hours, @date2) < @date1 
SELECT @hours=@hours-1
SET @date2= DATEADD(hh, -@hours, @date2)

SELECT @minutes=DATEDIFF(mi, @date1, @date2)
IF DATEADD(mi, -@minutes, @date2) < @date1 
SELECT @minutes=@minutes-1
SET @date2= DATEADD(mi, -@minutes, @date2)

SELECT @seconds=DATEDIFF(s, @date1, @date2)
IF DATEADD(s, -@seconds, @date2) < @date1 
SELECT @seconds=@seconds-1
SET @date2= DATEADD(s, -@seconds, @date2)

SELECT @milliseconds=DATEDIFF(ms, @date1, @date2)

SELECT @result= ISNULL(CAST(NULLIF(@years,0) AS VARCHAR(10)) + ' years,','')
     + ISNULL(' ' + CAST(NULLIF(@months,0) AS VARCHAR(10)) + ' months,','')    
     + ISNULL(' ' + CAST(NULLIF(@days,0) AS VARCHAR(10)) + ' days,','')
     + ISNULL(' ' + CAST(NULLIF(@hours,0) AS VARCHAR(10)) + ' hours,','')
     + ISNULL(' ' + CAST(@minutes AS VARCHAR(10)) + ' minutes and','')
     + ISNULL(' ' + CAST(@seconds AS VARCHAR(10)) 
     + CASE
            WHEN @milliseconds > 0
                THEN '.' + CAST(@milliseconds AS VARCHAR(10)) 
            ELSE ''
       END 
     + ' seconds','')

SELECT @result

結果セットは次のようになります。Here is the result set.

118 years, 11 months, 11 days, 7 hours, 8 minutes and 1.123 seconds

例: Azure Synapse AnalyticsAzure Synapse AnalyticsParallel Data WarehouseParallel Data WarehouseExamples: Azure Synapse AnalyticsAzure Synapse Analytics and Parallel Data WarehouseParallel Data Warehouse

次の例では、startdate パラメーターと enddate パラメーターの引数として、各種の式を使用しています。These examples use different types of expressions as arguments for the startdate and enddate parameters.

J.J. startdate と enddate に列を指定するSpecifying columns for startdate and enddate

この例では、テーブルの 2 つの列に日付を格納し、両者の差を日単位で計算しています。This example calculates the number of day boundaries crossed between dates in two columns in a table.

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 TOP(1) DATEDIFF(day, startDate, endDate) AS Duration  
    FROM dbo.Duration;  
-- Returns: 1  

K.K. startdate と enddate にスカラー サブクエリおよびスカラー関数を指定するSpecifying scalar subqueries and scalar functions for startdate and enddate

この例では、startdateenddate の引数として、サブクエリとスカラー関数を使用しています。This example uses scalar subqueries and scalar functions as arguments for startdate and enddate.

-- Uses AdventureWorks  
  
SELECT TOP(1) DATEDIFF(day, (SELECT MIN(HireDate) FROM dbo.DimEmployee),  
    (SELECT MAX(HireDate) FROM dbo.DimEmployee))   
FROM dbo.DimEmployee;  
  

L.L. startdate と enddate に定数を指定するSpecifying constants for startdate and enddate

この例では、startdateenddate の引数として文字定数を使用しています。This example uses character constants as arguments for startdate and enddate.

-- Uses AdventureWorks  
  
SELECT TOP(1) DATEDIFF(day,
    '2007-05-07 09:53:01.0376635',
    '2007-05-08 09:53:01.0376635') FROM DimCustomer;  

M.M. startdate に順位付け関数を指定するSpecifying ranking functions for startdate

この例では、startdate の引数として順位付け関数を使用しています。This example uses a ranking function as an argument for startdate.

-- Uses AdventureWorks  
  
SELECT FirstName, LastName,
    DATEDIFF(day, ROW_NUMBER() OVER (ORDER BY   
        DepartmentName), SYSDATETIME()) AS RowNumber  
FROM dbo.DimEmployee;  

N. startdate に集計関数を指定するSpecifying an aggregate window function for startdate

この例では、startdate の引数として集計関数を使用しています。This example uses an aggregate window function as an argument for startdate.

-- Uses AdventureWorks  
  
SELECT FirstName, LastName, DepartmentName,
    DATEDIFF(year, MAX(HireDate)  
        OVER (PARTITION BY DepartmentName), SYSDATETIME()) AS SomeValue  
FROM dbo.DimEmployee  

関連項目See also

DATEDIFF_BIG (Transact-SQL)DATEDIFF_BIG (Transact-SQL)
CAST および CONVERT (Transact-SQL)CAST and CONVERT (Transact-SQL)