как получить число по месяцам между двумя датами в SQL Server 2005 - PullRequest
5 голосов
/ 13 января 2010

В моей таблице sql server 2005 есть столбец, который должен содержать количество месяцев, в течение которых служащий работал.

Поскольку у меня также есть дата, когда сотрудник был нанят, я хочу, чтобы столбец "months_In_Service" был вычисляемым.

Теперь, если я использую DATEDIFF(month,[DateEngaged],GETDATE()) в качестве формулы для месяца в столбце вычисляемых услуг, результаты иногда будут правильными, а другие - нет.

Каков был бы более надежный способ получения количества месяцев между значением DateEngaged и текущей датой? Какую формулу я должен использовать в моем вычисляемом столбце?

Ответы [ 4 ]

12 голосов
/ 13 января 2010

Нечто подобное (может понадобиться поменять местами 1 и 0, не проверено)

datediff(month,[DateEngaged],getdate()) +
 CASE WHEN DATEPART(day, [DateEngaged]) < DATEPART(day, getdate()) THEN 1 ELSE 0 END

DATEDIFF измеряет границы месяца, например, 00:00 первого числа каждого месяца, а не годовщины дня месяца

Редактировать: после просмотра комментария ОП вы должны вычесть 1, если день начала> день окончания

DATEDIFF (month, DateEngaged, getdate()) -
 CASE
   WHEN DATEPART(day, DateEngaged) > DATEPART(day, getdate()) THEN 1 ELSE 0
 END

Итак, с 20 декабря по 13 января DATEDIFF выдает 1, а затем 20> 13, поэтому вычтите 1 = ноль месяцев.

4 голосов
/ 13 января 2010

Тот же подход, что и у gbn, но с меньшим количеством нажатий клавиш: -)

SELECT 
    DATEDIFF(MONTH, DateEngaged, GETDATE()) +
    CASE 
        WHEN DAY(DateEngaged) < DAY(GETDATE())
        THEN 1 
        ELSE 0 
    END
1 голос
/ 13 января 2010

Может быть, вы хотите что-то вроде:

(year(getdate())-year([DateEngaged]))*12+(month(getdate())-month([DateEngaged]))
0 голосов
/ 13 января 2010

Если вы предполагаете, что месяц означает 30 дней, вы также можете округлить вейл

round((datediff(day,[DateEngaged],getdate()))/30.00,0)
...