Короткий ответ
Там нет встроенной функции, но вы можете довольно легко создать свою собственную для обработки преобразования даты и времени в int. Оттуда SQL, который вы должны будете написать, будет тривиальным.
Длинный ответ
Нет встроенной функции, которая будет делать это, вероятно, потому что каждый месяц не имеет 30 дней. :)
Вы можете начать с этого:
DECLARE @start DATETIME = '2011-01-01',
@end DATETIME = '2011-04-15'
DECLARE @endConverted INT
SELECT @endConverted = DATEPART(month, @end) * 30
+ CASE
WHEN DATEPART(DAY, @end) <= 30
THEN datepart(DAY, @end)
ELSE 30
END
DECLARE @startConverted INT
SELECT @startConverted = DATEPART(MONTH, @start) * 30
+ CASE
WHEN DATEPART(DAY, @start) <= 30
THEN DATEPART(DAY, @start)
ELSE 30
END
SELECT @endConverted - @startConverted
Это не красивый SQL, но он работает. Обратите внимание, что он возвращает 104 (потому что 15 дней - 1 день = 14 дней), но достаточно простой, чтобы привязать + 1
к концу окончательного выбора, если вы хотите обрабатывать ограниченные дни по-другому.
Обратите внимание, что математика здесь довольно легко может быть перенесена в функцию, которая позволит вам очистить ваш SQL. Предположим, вы создали функцию с именем GetDateTimeAsInt
, в которой хранится математика; ваш SQL может быть таким простым, как
DECLARE @start INT = GetDateTimeAsInt('2011-01-01'),
@end INT = GetDateTimeAsInt('2011-04-15')
SELECT @end - @start -- may need to add 1 here
В моем тестировании это похоже на работу. Он вернет тот же результат, что и функция DATEDIFF
для диапазона дат, который вы указали в своем сообщении, но это потому, что есть 2 дня с 31 днем и 1 день с 28, поэтому с января по апрель по 30 дней каждый. Если вы используете его с более широким диапазоном дат, вы начнете получать другие результаты с моим кодом от функции DATEDIFF
.
Надеюсь, это поможет.