6

在 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)

4

3 回答 3

9

如果您使用整数作为第二个参数(或任何 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...

于 2012-08-14T15:18:44.183 回答
5

考虑下面的例子来更好地理解这个概念。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)) 
于 2017-08-07T17:52:07.980 回答
1

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

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

第二个例子是相当荒谬的。在实施时,日期表示为自最早日期以来的天数。这是自最早日期后 1000 天以来的年数。

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

于 2012-08-14T15:18:02.610 回答