2012-08-14 28 views
0

我已经提到this on MSDN但我仍然不能确定在DATEDIFF函数的第二个参数是做在下面两个例子:混乱在DATEDIFF函数的第二个参数

SELECT DATEDIFF(yy,0,getdate()) --run 14 AUG这将返回112

SELECT DATEDIFF(yy,1000,getdate()) - 我选择了1000任意和8月14日运行此返回110

通常我会用DATEDIFF找到两个个月,第二间的年度天数,或数论证是一个日期。

原因我想上述理解的是最终了解以下信息:

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

回答

3

如果您使用整数作为第二个参数(或针对该事件的任何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; 

结果:

消息206 ,等级16,状态2,行1
操作数类型冲突:INT与日期

不兼容,但它仍然可以使用日期的功能,如工作:

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

结果:

2012-08-14 

对于这些不一致的原因,我建议您使用适当的日期文字,以便清楚地表明您指的是哪个日期,并且无论数据类型如何,它都能正常工作。这是我发现很难打破的习惯,因为打字0比19000101更容易...

+0

所以如果我有第二个参数为1000那么它是在1900-01-01之后的1000天? – whytheq 2012-08-14 15:21:57

+0

@whytheq是的,这是正确的。 – 2012-08-14 15:23:32

+0

感谢您的额外解释 – whytheq 2012-08-14 15:38:52

1

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

第一个示例返回SQL Server世界中的“开始”时间。那将是目前的112年。

第二个例子是非常不合理的。如所实施的那样,日期表示为自最早日期以来的天数。这是自最早日期1000天以来的年数。

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

+0

+1谢谢你的帮助 – whytheq 2012-08-14 15:39:22

2

考虑下面的例子以更好地理解这个概念。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))