Как выбрать количество отдельных дней в диапазоне дат? - PullRequest
1 голос
/ 29 ноября 2011

Я пытаюсь использовать функцию T-SQL DATEDIFF, чтобы выбрать количество разных дат за период времени.

Следующий запрос:

SELECT DATEDIFF(DAY, '2012-01-01 01:23:45', '2012-01-02 01:23:45')

выбирает 1, что на один меньше, чем я хочу. В диапазоне есть две разные даты: 2012-01-01 и 2012-01-02.

Неправильно добавлять единицу к результату в общем случае. Следующий запрос:

SELECT DATEDIFF(DAY, '2012-01-01 00:00:00', '2012-01-02 00:00:00')

выбирает 1, что является правильным, поскольку в диапазоне имеется только одна отдельная дата.

Я уверен, что есть простая часть арифметики, которую мне не хватает, чтобы вычислить это. Кто-нибудь может мне помочь?

1 Ответ

1 голос
/ 29 ноября 2011
SELECT DATEDIFF(DAY, '2012-01-01 01:23:45', '2012-01-02 01:23:45') 

Учитывая этот пример, оно все равно должно быть 1, потому что прошел только один день.Даже если вы рассматриваете начало дня, оно все равно будет только одним (так как этот диапазон включает начало только 2012-01-02 00:00:00).

Ваша логика для:

SELECT DATEDIFF(DAY, '2012-01-01 01:23:45', '2012-01-02 01:23:45') 

и

SELECT DATEDIFF(DAY, '2012-01-01 00:00:00', '2012-01-02 00:00:00') 

Должны быть одинаковыми, поскольку математически они имеют одинаковый диапазон.DATEDIFF сравнивает на основе гранулярности первого параметра.Вы сравниваете по day, поэтому SQL Server будет видеть 2012-01-01 до 2012-01-02 как 1 разницу в днях.

Чрезвычайно уродливый (и, на мой взгляд, плохой) обходной путь будет выглядеть примерноthis:

SELECT DATEDIFF(day, yourStartDate, dateadd(ss, -1, yourEndDate)) + 1

То, что это будет делать, это обрабатывать инклюзивные даты.Таким образом, вы могли бы в основном иметь это:

SELECT DATEDIFF(DAY, '2012-01-01 01:23:45', dateadd(ss, -1, '2012-01-02 01:23:45')) + 1 

будет равно 2 и это:

SELECT DATEDIFF(DAY, '2012-01-01 00:00:00', dateadd(ss, -1, '2012-01-02 00:00:00')) + 1

будет равно 1.Я не думаю, что это лучшая идея в мире, но она даст вам желаемый результат.Все сводится к бизнес-логике.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...