混淆DATEDIFF函数的第二个参数

时间:2012-08-14 15:15:11

标签: sql sql-server-2008-r2

我已经提到this on MSDN但我仍然不确定DATEDIFF函数中的第二个参数在以下两个示例中是做什么的:

SELECT DATEDIFF(yy,0,getdate()) - 8月14日运行,返回112

SELECT DATEDIFF(yy,1000,getdate()) - 我任意选择1000并在8月14日运行,这将返回110

通常我会使用DATEDIFF来查找天数,或两个月之间的年数,然后第二个参数就是日期。

原因我想了解以上内容是为了最终理解以下内容:

SELECT DATEADD(yy, DATEDIFF(yy,0,GETDATE()), 0)

3 个答案:

答案 0 :(得分:5)

如果使用整数作为第二个参数(或任何datetime / smalldatetime赋值),则将其解释为自1900-01-01以来的天数。

DECLARE @d1 DATETIME = 0, @d2 DATETIME = 1;
SELECT @d1, @d2;

结果:

1900-01-01 00:00:00.000    1900-01-02 00:00:00.000

请注意,在直接分配期间,这不适用于DATE等新数据类型:

DECLARE @d DATE = 0;

结果:

  

Msg 206,Level 16,State 2,Line 1
  操作数类型冲突:int与日期不兼容

但它仍然可以使用日期数学,例如:

DECLARE @d DATE = DATEADD(YEAR, 0, SYSDATETIME());
SELECT @d;

结果:

2012-08-14

由于这些不一致的原因,我建议您使用正确的日期文字,以便明确您的日期,以便无论数据类型如何都可以使用。这是一个我很难打破的习惯,因为输入0比19000101 ...

容易得多

答案 1 :(得分:3)

考虑以下示例,更好地理解这个概念。 0是默认日期"1900-01-01"

查询下方的输出为 2017-10-31 00:00:00.000

SELECT    DATEADD(DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH,0,SYSDATETIME())+3, 0)) 

将上述查询分成不同部分以理解计算。

-- 1414 Months since '1900-01-01'
    SELECT DATEDIFF(MONTH,0,SYSDATETIME())  + 3 

-- adding 1414 Months to Default date 1900 Produces '2017-11-01 00:00:00.000'
    SELECT DATEADD(MONTH, DATEDIFF(MONTH,0,SYSDATETIME())+3, 0) 

--Subtract 1 day from '2017-11-01 00:00:00:000' gives last day of previous month.
    SELECT DATEADD(DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH,0,SYSDATETIME())+3, 0)) 

答案 2 :(得分:1)

datediff()的第二个参数是日期。

第一个示例返回SQL Server世界中的“开始”日期。那将是当前日期之前的112年。

第二个例子是非感性的。实施后,日期表示为自最早日期以来的天数。这是自最早日期起1000天以来的年数。

最后一个示例为基准日期添加了若干年。然后它增加了几个月。由于基准日期是1/1/1900,因此这将为您提供第y年第n个月之后的第一天。