【问题标题】:Handling nulls in DATEDIFF calculation在 DATEDIFF 计算中处理空值
【发布时间】:2016-12-30 01:09:34
【问题描述】:

我正在使用 Microsoft SQL Server 2012 并不断遇到错误

遇到除以零错误。

对于如下语句。如果两个日期相同,我想添加一个 null。

SELECT 
    sf.TotalPrice / DATEDIFF(day, sf.StartDate,sf.EndDate) as DailyAllocatedRevenue,
    sf.TotalPrice
FROM 
    sftable 

【问题讨论】:

    标签: tsql select sql-server-2012 datediff


    【解决方案1】:

    您可以将DATEDIFF 包装在NULLIF 中:

    SELECT 
    
        sf.TotalPrice / NULLIF(DATEDIFF(day, sf.StartDate,sf.EndDate),0) as DailyAllocatedRevenue
        ,sf.TotalPrice
    
    FROM sftable 
    

    如果任何输入为NULL,或结果为0,它将变为NULL,并通过除法传播。

    【讨论】:

    • @Damien,不太确定 OP 是否已阅读或理解您关于 NULL 传播的警告!
    • @PaulBambury - 我认为空传播实际上是他们想要的一部分。我可能是错的,但我认为他们希望整体结果(DailyAllocatedRevenue)是NULL,而不是产生除以零错误。
    【解决方案2】:

    在 Sql-Server 中使用 NullIf 函数 如果差异返回 0,它将返回 null

    看到这个link会帮助你

    SELECT 
    
        sf.TotalPrice / NULLIF(DATEDIFF(day, sf.StartDate,sf.EndDate),0) as DailyAllocatedRevenue
        ,sf.TotalPrice
    
    FROM sftable 
    

    【讨论】:

      【解决方案3】:

      尝试使用

      case 
           when sd.startdate <> sd.EndDate then sf.TotalPrice / DATEDIFF(day, sf.StartDate, sf.EndDate) as DailyAllocatedRevenue
           else sf.TotalPrice
      end
      

      【讨论】:

        【解决方案4】:
        IIF(DATEDIFF(day, sf.StartDate,sf.EndDate)=0,NULL, sf.TotalPrice
        /Convert(Decimal(18,4),DATEDIFF(day, sf.StartDate,sf.EndDate)))
        

        应该做的伎俩

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-02-10
          • 2017-07-18
          • 1970-01-01
          • 1970-01-01
          • 2023-03-23
          • 1970-01-01
          • 1970-01-01
          • 2021-03-27
          相关资源
          最近更新 更多