2016-08-23 2 views
0

Я использую Microsoft SQL Server 2012 и продолжает работать в встретившейся ошибкеОбработка обнуляет в расчете DATEDIFF

Деление на ноль ошибок.

для утверждения, как показано ниже. Я хочу добавить нуль, если две даты совпадают.

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

ответ

2

Вы можете просто обернуть DATEDIFF в NULLIF:

SELECT 

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

FROM sftable 

Если какой-либо из входов NULL, или результат 0, он станет NULL и распространяется через деление.

+0

Это интересно увидеть так много обходной путь. – qxg

+0

@ Damien, не совсем уверен, что OP прочитал или понял ваше предупреждение о распространении NULL! –

+0

@PaulBambury - Я думаю, что распространение пустоты на самом деле является частью того, что они хотели. Я мог ошибаться, но я думаю, что они хотели, чтобы общий результат (для 'DailyAllocatedRevenue') был' NULL', а не производил деление на нулевую ошибку. –

2

Использование NullIf Функция в Sql-сервере он будет возвращать нулевое значение, если разница возвращает 0

Посмотрите этот link поможет вам

SELECT 

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

FROM sftable 
0
IIF(DATEDIFF(day, sf.StartDate,sf.EndDate)=0,NULL, sf.TotalPrice 
/Convert(Decimal(18,4),DATEDIFF(day, sf.StartDate,sf.EndDate))) 

следует сделать трюк

1

Try и использовать

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