2015-06-01 4 views
-4

Я хочу построить скалярную функцию, которая вычисляет дни между двумя датами:Как рассчитать дни между двумя датами

'20/03/2014'-'01/02/2015'=312 

некоторых показаний

all month=30 days 
1 year =360 days 
the two dates are add to calculation 

Я тестировал

select DATEDIFF(DAY,'20/03/2014','01/02/2015') 

но результат равен = 318, и это для меня неверно (правильный результат 312)

Я проверил также

Select datediff(month, '01/02/2014', '28/02/2014') * 30 - (DATEPART(day,'01/02/2014') - datepart(day, '28/02/2014')) 

и результат был 28, и что является ложным, потому что результат должен быть 30 дней заранее спасибо

+0

Пожалуйста, читайте здесь: https://msdn.microsoft.com/en-us/library/ms189794.aspx –

+0

Ваш вопрос не имеет смысла. Почему недостаточно встроенной функции 'lateiff()'? Если нет, укажите данные образца и желаемые результаты, желательно в формате таблицы, чтобы мы могли прочитать его. –

+2

Что вы подразумеваете под 'all month = 30 days и 1 year = 360 days'? Если вы указываете свой собственный календарь, то, конечно, встроенные функции календаря не будут работать. – TTeeple

ответ

3

Это даст вам DATEDIFF для календаря на 360 дня:

Exclusive диапазон дат:

if datepart(day, @date2) = datepart(day,dateadd(day, -1,(Cast(Cast(datepart(year, @date2) as varchar) + '-' + Cast(datepart(month, @date2) + 1 as varchar) + '-01' as date)))) 
begin 
    Select datediff(month, @date1, @date2) * 30 - (DATEPART(day, @date1) - 30) 
end 
else if datepart(day, @date1) = datepart(day,dateadd(day, -1,(Cast(Cast(datepart(year, @date1) as varchar) + '-' + Cast(datepart(month, @date1) + 1 as varchar) + '-01' as date)))) 
begin 
    Select datediff(month, @date1, @date2) * 30 - (30 - datepart(day, @date2)) 
end 
else 
begin 
    Select datediff(month, @date1, @date2) * 30 - (DATEPART(day, @date1) - datepart(day, @date2)) 
end 

Inclusive диапазон дат:

if datepart(day, @date2) = datepart(day,dateadd(day, -1,(Cast(Cast(datepart(year, @date2) as varchar) + '-' + Cast(datepart(month, @date2) + 1 as varchar) + '-01' as date)))) 
begin 
    Select datediff(month, @date1, @date2) * 30 - (DATEPART(day, @date1) - 30) + 1 
end 
else if datepart(day, @date1) = datepart(day,dateadd(day, -1,(Cast(Cast(datepart(year, @date1) as varchar) + '-' + Cast(datepart(month, @date1) + 1 as varchar) + '-01' as date)))) 
begin 
    Select datediff(month, @date1, @date2) * 30 - (30 - datepart(day, @date2)) + 1 
end 
else 
begin 
    Select datediff(month, @date1, @date2) * 30 - (DATEPART(day, @date1) - datepart(day, @date2)) + 1 
end 

Проверка If, чтобы узнать, является ли какой-либо из дат последним днем ​​месяца. Если они тогда, то они рассматривают его как 30-е, поскольку каждый месяц должен быть 30 дней.

Он вычисляет количество месяцев, умножает на 30, а затем разницу в последующие дни.

Если вы запускаете этот год в год с датами, он даст 360, если вы используете свой пример, он дает 311, но это верно.

SQL Скрипки: http://sqlfiddle.com/#!6/9eecb/5791/0

+0

Нужно добавить 1 к концу, если вы хотите сделать его инклюзивным. 30-20 = 10, но это исключение. – TTeeple

+0

Да, точно. Я сделал это изначально, но потом я просто почувствовал, что не согласен с этим. Я обновил свой ответ, чтобы включить оба момента: –

+0

Спасибо, Кристиан, но когда я выполняю запрос следующим образом: Выберите датифф (месяц, '01/01/2014 ', '31/12/2015') * 30 - (DATEPART (день) , '01/01/2014 ') - datepart (день, '31/12/2015')) + 1 результат составляет 721 день (360 * 2 = 720 дней) !!! – dba2015

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