Сражаясь в SQL функция datediff


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

DATEDIFF(m,{firstdate},{seconddate})
Однако я замечаю, что эта функция подсчитывает время, когда дата пересекает месячный порог. В примере...
DATEDIFF(m,3/31/2011,4/1/2011) will yield 1  
DATEDIFF(m,4/1/2011,4/30/2011) will yield 0 
DATEDIFF(m,3/1/2011,4/30/2011) will yield 1

Знает ли кто-нибудь, как найти месяцы между двумя датами больше-так что на основе времени прошло то время прошло ежемесячно порог?

4 5

4 ответа:

Если вы хотите найти некоторое условное число месяцев, почему бы не найти разницу в днях, а затем разделить на 30 (приведение к плаванию по мере необходимости). Или 30,5-иш, возможно, - зависит от того, как вы хотите обрабатывать переменную длину месяца в течение года. Но, возможно, в вашем конкретном случае это не имеет значения.

Следующие утверждения имеют одинаковую начальную и конечную дату. Эти даты соседствуют и отличаются по времени.0000001 секунда. Разница между startdate и endate в каждом операторе пересекает одну календарную или временную границу его части даты. Каждое утверждение возвращает 1. ...
Выберите DATEDIFF (месяц, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000'); ....

(от DATEDIFF , section Datepart Boundaries ). Если ты вас это не устраивает, вам, вероятно, нужно использовать дни как единицу измерения, как предложил Мартин Клейтон

DATEDIFF(m,{firstdate},ISNULL({seconddate},GETDATE())) - CASE 
                                                         WHEN DATEPART(d,{firstdate}) >= DATEPART(d,ISNULL({seconddate},GETDATE()))
                                                         THEN 1
                                                         ELSE 0

DATEDIFF таков по замыслу. При оценке конкретного измерения времени (например, месяцев, дней и т. д.), он рассматривает только это измерение и более высокие значения-игнорируя меньшие. Вы столкнетесь с таким поведением при любом измерении времени. Например, если вы использовали DATEDIFF для вычисления дней, и одна дата была за несколько секунд до полуночи, а другая - за несколько секунд после полуночи, вы получите разницу в 1 день, даже если эти две даты были всего за несколько секунд отдельно.

DATEDIFF предназначен для того, чтобы дать приблизительный ответ на вопросы, такие как:

Вопрос: сколько вам лет? Ответ: некоторое целое число. Вы не говорите: "мне 59 лет, 4 месяца, 17 дней, 5 часов, 35 минут и 27 секунд". Вы просто говорите:"мне 59 лет". Это тоже подход ДАТЕДИФФА.

Если вы хотите получить ответ, который соответствует некоторому контекстуальному значению (например, ваш сын, который говорит: "мне не 8! Мне 8 и 3 четверти! или я почти 9!), то вы должны посмотреть при следующем-наименьшее измерение и приближенное с ним. Поэтому, если вы ищете месяцы, то вместо этого сделайте DATEDIFF по дням или часам и попытайтесь приблизить месяцы, однако это кажется наиболее подходящим для вашей ситуации (возможно, вы хотите получить ответы, такие как 1-1/2 месяца или 1,2 месяца и т. д.) использование видов логики CASE / IF-THEN.