我已经提到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)
答案 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个月之后的第一天。