SQL Server,DATEDIFF的结果不一致
我试图理解为什么SQL Server,DATEDIFF的结果不一致,sql,sql-server,datediff,Sql,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
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, rn, 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年
2001年
有人能给我解释一下吗?我是否对单个select语句做了错误的处理
谢谢您的帮助。这就是datediff的参数
DATEDIFF ( datepart , startdate , enddate )
根据您传递的参数判断,我假设您试图从日期中减去1或2天。你应该使用
DATEADD (datepart , number , date )
所以减法变成了加减法,比如DATEADD(day,-1,'2015-10-02')
如果确实希望按预期使用DATEDIFF
函数,请确保在日期周围使用单引号,并阅读中的datepart边界部分,因为边界处的纳秒差可能会转化为结果中的年差
另外,当使用数字X作为日期时,SQL Server会将其解释为(1900-01-01+X天)。设置一个复制该问题的数据库。@Prashy,datediff函数采用2个日期而不是日期编号
2015-10-02
与'2015-10-02'
.2015-10-01=2004非常不同。您必须编写选择DATEDIFF(日期,1,'2015-10-01')
@DenisRubashkin非常感谢。现在我明白了。在我添加了引号之后,它工作得很好。
DATEADD (datepart , number , date )