2010-01-13 5 views
5

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

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

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

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

+0

Не могли бы вы привести несколько примеров того, что вы имеете в виду, когда говорите, что иногда они правильные и что-то вроде им они не являются. –

+0

Не могли бы вы отредактировать это (редактировать) и установить sql-server-2005 (или даже просто sql-сервер)? Обратите внимание на тире. Здесь есть пользователи, которые игнорируют вопросы SQL Server (а не их опыт), но интересуются вопросами SQL. –

+0

DateEngaged = '12/20/2009 " CurrentDate = '1/13/2010" Это дает мне месяцы в обслуживании как 1, используя формуляр «датированный» (месяц, [DateEngaged], getdate() + (1)) » Он также дает годы в эксплуатации как 1, используя формулу «датированный (год, [DateEngaged], getdate() + (1))» – StackTrace

ответ

12

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

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

границы DATEDIFF мера месяц, например, 00:00 время 1-го числа каждого месяца, а не день-месяц юбилеи

Edit: после просмотра комментария OP, вы должны вычесть 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 = нулевой мон тыс.

+0

это, кажется, работает правильно, я просто собираюсь проверить его на всякий случай. – StackTrace

+1

Вы когда-нибудь проверяли, что происходит, когда работник занимается 31 октября, а текущая дата - 30 ноября? Эта процедура возвращает 0 месяцев, но на самом деле практически каждое бизнес-требование, которое я могу себе представить, скажет, что это месяц. Нашел это, ища решение этой проблемы. Еще глядя ... – Ron

+0

Не блестящее решение, что объясняет @Ron? – toscanelli

1

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

(year(getdate())-year([DateEngaged]))*12+(month(getdate())-month([DateEngaged])) 
-2

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

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

Я точно хочу, чтобы месяц имел в виду 30 дней и год двенадцать месяцев 30 дней (каждый!). – StackTrace

+5

С течением времени это дрейфует все дальше и дальше. Через 6 лет ошибка - целый месяц, гарантированный – gbn

4

же подход, как ГБН, но с меньшим количеством нажатий на клавиши: -)

SELECT 
    DATEDIFF(MONTH, DateEngaged, GETDATE()) + 
    CASE 
     WHEN DAY(DateEngaged) < DAY(GETDATE()) 
     THEN 1 
     ELSE 0 
    END