2016-01-08 3 views
2

Мне нужно рассчитать срок годности. Должно быть довольно легко? Ну, моя «продолжительность жизни» - это годы, а не дни, и чтобы сделать ее более сложной, ценность лет может быть дробной. Вот то, что я начинаю с:Как вы рассчитываете дату истечения срока действия в SQL Server?

set @ExpirationDate = DATEADD(year, @LifeSpanYears, @BeginDate) 

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

Как вы рассчитываете дату окончания с дробным годом?

ответ

3

Это ответ, который я придумал:

create function Reporting.CalcExpirationDate (@LifeSpanYears decimal(9,2), @BeginDate date) 
returns date 
begin 
    return DATEADD(day, (@LifeSpanYears * 365.25), @BeginDate) 
end 

Затем использовать его как это:

  select Reporting.CalcExpirationDate (13 , '2015-09-01') as CalculatedDate, '2028-09-01' as ExpectedDate 
union all select Reporting.CalcExpirationDate (13.5 , '2015-09-01') as CalculatedDate, '2029-03-01' as ExpectedDate 

Примечания: Как я работал над этим я понял, что это невозможно определить точную дату истечения срока действия с использованием дробного года в качестве срока службы. Откуда вы знаете, когда добавлять високосные дни или нет? Если вам действительно нужен точный ответ, вам нужна продолжительность жизни в днях.

1

На практике «продолжительность жизни в годах», вероятно, является продолжительностью жизни в течение нескольких месяцев. Если это так, вы можете подумать:

return dateadd(month, round(@LIfeSpanYears * 12, 0), @BeginDate) 

Это относится к проблеме с високосными годами. Тем не менее, это происходит за счет разрешения только месяцев.

+0

Вы знаете, что я мог бы сделать? Я мог бы разделить целочисленную и дробную часть LifeSpanYears. Добавьте дробное число дней, используя мой ответ, затем добавьте целое число лет, которое будет обрабатывать високосные годы. Ответ по-прежнему не является детерминированным, потому что я даже не уверен, что должен ответить *. :) – Jess

+1

@Jess. , , Это приблизилось бы. Он не справится с ситуацией, когда дни пересекают границу високосного года, но вы должны быть не более чем на один день. –

Смежные вопросы