代码之家  ›  专栏  ›  技术社区  ›  Mr. Bhosale

SQL日期差天数结果错误

  •  3
  • Mr. Bhosale  · 技术社区  · 8 年前

    我想计算两个日期之间的日差。

    当我计算‘2017-01-01’和‘2018-01-15’之间的差异时,它有379天。

    SELECT DATEDIFF(DD,'2017-01-01','2018-01-15') 
    

    但当我把日期加起来分成两部分时,结果是378。

    select DATEDIFF( DD,'2017-01-01', '2017-12-31') + DATEDIFF( DD,'2018-01-01', '2018-01-15') 
    

    有人解释我为什么会这样吗?

    4 回复  |  直到 8 年前
        1
  •  4
  •   Lukasz Szozda    8 年前

    这是一个非常简单的数学公式:

    I:  <a,b>
    II: <a,c>,<c+1,b>   where c is between a and b
    
    I      II
    b-a != b-(c+1) + c-a
    b-a != b-c-1 + c-a
    b-a != b-a-1       -- here is 1 missing day
    

    为了使其正确,您可以使用:

    select DATEDIFF( DD,'2017-01-01', '2018-01-01') 
         + DATEDIFF( DD,'2018-01-01', '2018-01-15') 
    
        2
  •  3
  •   George Menoutis    8 年前

    Datediff 计算两个日期之间DateType的边界。

    边界“2017-12-31结束”-“2018-01-01开始”包含在第一个案例中,但不包括第二个案例。

        3
  •  2
  •   Gordon Linoff    8 年前

    分为两部分的正确方法是重复日期:

    select (DATEDIFF(DAY, '2017-01-01', '2017-12-31') +
            DATEDIFF(DAY, '2017-12-31', '2018-01-15') 
           )
    

    你的版本一天跳过一次,所以一天就关闭一点也不奇怪。

        4
  •  1
  •   janith1024 solan rocks    8 年前

    这是因为在第二种情况下没有计算额外的一天。解释为什么会在第一个查询中发生

    SELECT DATEDIFF(DD,'2017-01-01','2018-01-15')
    

    你正在做类似的事情:1-380=379。

    而在第二个

    它是(1-365)+(1-15)=364+14=378。

    取决于你在追求什么

    最好将其分解为:

    select DATEDIFF( DD,'2017-01-01', '2018-01-01') + DATEDIFF( DD,'2018-01-01', '2018-01-15')
    
    推荐文章