SELECT DATEDIFF(year, @startdate, @enddate)
これを試して、正しい方向に進んでください。
year
返したい測定期間を表します
役立つ可能性のある MSDN 記事へのリンクを次に示します。
DATEDIFF
(Transact-SQL)
他のバージョン
更新日: 2015 年 12 月 2 日
このトピックは以下に適用されます:
はいSQL Server (2008 以降) はいAzure SQL データベース はいAzure SQL データ ウェアハウス はいParallel Data Warehouse 指定された startdate と enddate の間で交差する指定された datepart 境界の数 (符号付き整数) を返します。大きな違いについては、「DATEDIFF_BIG (Transact-SQL)」を参照してください。Transact-SQL のすべての日付と時刻のデータ型と関数の概要については、「日付と時刻のデータ型と関数 (Transact-SQL)」を参照してください。トピック リンク アイコン Transact-SQL 構文規則 構文
DATEDIFF ( datepart , startdate , enddate )
-- Azure SQL データ ウェアハウスと並列データ ウェアハウス
DATEDIFF (datepart ,startdate ,enddate )
引数
日付部分
交差する境界のタイプを指定する startdate と enddate の一部です。次の表に、有効なすべての 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 桁の年の詳細については、2 桁の年カットオフ サーバー構成オプションの構成を参照してください。終了日
startdateを参照してください。
戻り値の型 int
戻り値 各日付部分とその省略形は同じ値を返します。戻り値が int の範囲外 (-2,147,483,648 ~ +2,147,483,647) の場合、エラーが返されます。ミリ秒の場合、開始日と終了日の最大差は 24 日 20 時間 31 分 23.647 秒です。第二に、最大の差は 68 年です。startdate と enddate の両方に時刻の値のみが割り当てられ、datepart が時刻の datepart でない場合は、0 が返されます。startdate または endate のタイム ゾーン オフセット コンポーネントは、戻り値の計算には使用されません。smalldatetime は分までしか正確ではないため、startdate または enddate に smalldatetime 値を使用すると、戻り値で秒とミリ秒が常に 0 に設定されます。日付データ型の変数に時間値のみが割り当てられている場合、欠落している日付部分の値は、デフォルト値の 1900-01-01 に設定されます。時刻または日付データ型の変数に日付値のみが割り当てられている場合、欠落している時刻部分の値はデフォルト値の 00:00:00 に設定されます。startdate または enddate のいずれかが時刻部分のみで、もう一方が日付部分のみの場合、欠落している時刻部分と日付部分はデフォルト値に設定されます。startdate と enddate の日付データ型が異なり、一方の時刻部分または小数秒の精度が他方よりも多い場合、他方の欠落部分は 0 に設定されます。これらの日付は隣接しており、時刻が 0.0000001 秒異なります。各ステートメントの startdate と endate の差は、datepart の 1 つのカレンダーまたは時間の境界を超えています。各ステートメントは 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');
備考 DATEDIFF は、選択リスト、WHERE、HAVING、GROUP BY、および ORDER BY 句で使用できます。DATEDIFF は、暗黙的に文字列リテラルを datetime2 型としてキャストします。これは、日付が文字列として渡される場合、DATEDIFF は形式 YDM をサポートしないことを意味します。YDM 形式を使用するには、文字列を明示的に datetime または smalldatetime 型にキャストする必要があります。SET DATEFIRST を指定しても、DATEDIFF には影響しません。DATEDIFF は、関数が決定論的であることを保証するために、常に日曜日を週の最初の曜日として使用します。例 次の例では、さまざまなタイプの式を 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;
-- 戻り値: 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 の引数としてスカラー サブクエリとスカラー関数を使用しています。AdventureWorks2012 を使用します。行く
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 の引数として使用します。
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. Specifying ranking functions for startdate
The following 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. startdate の集計ウィンドウ関数の指定 次の例では、集計ウィンドウ関数を 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
例: Azure SQL Data Warehouse パブリック プレビューと Parallel Data Warehouse 次の例では、さまざまな種類の式を startdate パラメーターと enddate パラメーターの引数として使用しています。I. 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 TOP(1) DATEDIFF(day,startDate,endDate) AS Duration
FROM dbo.Duration;
-- 戻り値: 1 J. startdate と enddate にスカラー サブクエリとスカラー関数を指定する 次の例では、startdate と enddate の引数としてスカラー サブクエリとスカラー関数を使用します。-- AdventureWorks を使用
SELECT TOP(1) DATEDIFF(day,(SELECT MIN(HireDate) FROM dbo.DimEmployee),
(SELECT MAX(HireDate) FROM dbo.DimEmployee))
FROM dbo.DimEmployee;
K. startdate と enddate の定数の指定 次の例では、startdate と enddate の引数として文字定数を使用しています。
-- Uses AdventureWorks
SELECT TOP(1) DATEDIFF(day, '2007-05-07 09:53:01.0376635'
, '2007-05-08 09:53:01.0376635') FROM DimCustomer;
L. startdate のランキング関数の指定 次の例では、startdate の引数としてランキング関数を使用しています。-- AdventureWorks を使用
SELECT FirstName, LastName
,DATEDIFF(day,ROW_NUMBER() OVER (ORDER BY
DepartmentName),SYSDATETIME()) AS RowNumber
FROM dbo.DimEmployee;
M. startdate の集計ウィンドウ関数の指定 次の例では、集計ウィンドウ関数を startdate の引数として使用しています。-- AdventureWorks を使用
SELECT FirstName, LastName, DepartmentName
,DATEDIFF(year,MAX(HireDate)
OVER (PARTITION BY DepartmentName),SYSDATETIME()) AS SomeValue
FROM dbo.DimEmployee