SQL Server,导致DATEDIFF不一致

问题描述

我试图了解为什么DATEDIFF不能始终如一地工作。

我有一个表Projects,具有以下值:

Task_ID     Start_Date      End_Date
--------------------------------------
1           2015-10-01      2015-10-02
24          2015-10-02      2015-10-03
2           2015-10-03      2015-10-04
23          2015-10-04      2015-10-05
3           2015-10-11      2015-10-12
22          2015-10-12      2015-10-13
4           2015-10-15      2015-10-16
21          2015-10-17      2015-10-18
5           2015-10-19      2015-10-20
20          2015-10-21      2015-10-22
6           2015-10-25      2015-10-26
19          2015-10-26      2015-10-27
7           2015-10-27      2015-10-28
18          2015-10-28      2015-10-29
8           2015-10-29      2015-10-30
17          2015-10-30      2015-10-31
9           2015-11-01      2015-11-02
16          2015-11-04      2015-11-05
10          2015-11-07      2015-11-08
15          2015-11-06      2015-11-07
11          2015-11-05      2015-11-06
14          2015-11-11      2015-11-12
12          2015-11-12      2015-11-13
13          2015-11-17      2015-11-18

当我对它运行以下查询时;

WITH t AS 
(
    SELECT 
        Start_Date s,End_Date e,ROW_NUMBER() OVER(ORDER BY Start_Date) rn
    FROM 
        Projects
    GROUP BY 
        Start_Date,End_Date
)
SELECT 
    s,e,rn,DATEDIFF(day,s)
FROM t

我得到以下输出:

2015-10-01      2015-10-02      1       42275
2015-10-02      2015-10-03      2       42275
2015-10-03      2015-10-04      3       42275
2015-10-04      2015-10-05      4       42275
2015-10-11      2015-10-12      5       42281
2015-10-12      2015-10-13      6       42281
2015-10-15      2015-10-16      7       42283
2015-10-17      2015-10-18      8       42284
2015-10-19      2015-10-20      9       42285
2015-10-21      2015-10-22      10      42286
2015-10-25      2015-10-26      11      42289
2015-10-26      2015-10-27      12      42289
2015-10-27      2015-10-28      13      42289
2015-10-28      2015-10-29      14      42289
2015-10-29      2015-10-30      15      42289
2015-10-30      2015-10-31      16      42289
2015-11-01      2015-11-02      17      42290
2015-11-04      2015-11-05      18      42292
2015-11-05      2015-11-06      19      42292
2015-11-06      2015-11-07      20      42292
2015-11-07      2015-11-08      21      42292
2015-11-11      2015-11-12      22      42295
2015-11-12      2015-11-13      23      42295
2015-11-17      2015-11-18      24      42299

但是当我单独执行DATEDIFF时,会得到不同的结果:

select DATEDIFF(day,1,2015-10-01)

2003

select DATEDIFF(day,2,2015-10-02)

2001

有人可以向我解释一下吗?我对单个选择语句做错了吗?

感谢您的帮助。

解决方法

这是datediff的参数。

DATEDIFF ( datepart,startdate,enddate )  

从传递的参数来看,我假设您要减去一个日期后的1或2天。您应该使用

DATEADD (datepart,number,date )  

所以减法变成加减DATEADD (day,-1,'2015-10-02')

如果您确实想按预期使用DATEDIFF函数,请确保在日期周围使用单引号,并阅读documentation中的datepart边界部分,因为边界处的纳秒差会导致变成一年的结果差异。

另外,当使用数字X作为日期时,SQL Server会将其解释为(1900-01-01 + X天)。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...