SELECT DATEDIFF(year, @startdate, @enddate)
试试这个,让你朝着正确的方向前进。
year
表示您要返回的测量周期
这是指向可能有帮助的 MSDN 文章的链接
DATEDIFF
(事务处理 SQL)
其他版本
更新日期:2015 年 12 月 2 日
本主题适用于:
是SQL Server(从 2008 年开始) 是Azure SQL 数据库 是Azure SQL 数据仓库 是并行数据仓库 返回指定开始日期和结束日期之间跨越的指定日期部分边界的计数(有符号整数)。有关更大的差异,请参阅 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 可以是表达式、列表达式、用户定义的变量或字符串文字。从 enddate 中减去 startdate。
为避免歧义,请使用四位数年份。有关两位数年份的信息,请参阅配置两位数年份截止服务器配置选项。结束日期
请参阅开始日期。
返回类型 int
返回值 每个日期部分及其缩写返回相同的值。如果返回值超出 int 的范围(-2,147,483,648 到 +2,147,483,647),则返回错误。对于毫秒,startdate 和 enddate 之间的最大差异是 24 天 20 小时 31 分钟和 23.647 秒。其次,最大差异是 68 岁。如果 startdate 和 enddate 都只分配了一个时间值,并且 datepart 不是时间 datepart,则返回 0。startdate 或 endate 的时区偏移分量不用于计算返回值。因为 smalldatetime 仅精确到分钟,所以当 smalldatetime 值用于 startdate 或 enddate 时,返回值中的秒和毫秒始终设置为 0。如果仅将时间值分配给日期数据类型的变量,缺失日期部分的值设置为默认值:1900-01-01。如果仅将日期值分配给时间或日期数据类型的变量,则将缺失时间部分的值设置为默认值:00:00:00。如果 startdate 或 enddate 中只有一个时间部分而另一个只有一个日期部分,则缺少的时间和日期部分将设置为默认值。如果 startdate 和 enddate 是不同的日期数据类型,并且其中一个的时间部分或小数秒精度比另一个多,则另一个的缺失部分设置为 0。 datepart 边界 以下语句具有相同的 startdate 和相同的 endate。这些日期是相邻的,时间相差 0.0000001 秒。每个语句中的 startdate 和 endate 之间的差异跨越其日期部分的一个日历或时间边界。每个语句返回 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。您必须将字符串显式转换为 datetime 或 smalldatetime 类型才能使用 YDM 格式。指定 SET DATEFIRST 对 DATEDIFF 没有影响。DATEDIFF 始终使用星期日作为一周的第一天,以确保函数具有确定性。示例 下面的示例使用不同类型的表达式作为 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;
-- 返回: 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 数据仓库公共预览版和并行数据仓库 以下示例使用不同类型的表达式作为 startdate 和 enddate 参数的参数。I. 为 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 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