【问题标题】:SQL Server, inconsistency in result of DATEDIFFSQL Server,DATEDIFF 的结果不一致
【发布时间】:2020-08-13 07:19:31
【问题描述】:

我试图了解为什么 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

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

2001

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

感谢您的帮助。

【问题讨论】:

  • 设置一个重现问题的 dbfiddle。
  • @Prashy,datediff 函数需要 2 个日期而不是天数
  • 2015-10-02'2015-10-02'有很大不同。
  • 2015-10-01 = 2004。你必须写select DATEDIFF(day, 1, '2015-10-01')
  • @DenisRubashkin 非常感谢。现在我懂了。添加引号后,它工作正常。

标签: sql sql-server datediff


【解决方案1】:

这就是 datediff 的参数的样子。

DATEDIFF ( datepart , startdate , enddate )  

根据您传递的参数判断,我假设您尝试从日期减去 1 或 2 天。你应该使用

DATEADD (datepart , number , date )  

所以减法就变成了加减号,比如DATEADD (day,-1,'2015-10-02')

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多