У меня есть столбец в моей таблице SQL-сервера 2005 года, которая должна содержать число месяцев, сотрудник работал.
Так как у меня также есть дата, сотрудник был занят, я хочу, чтобы "months_In_Service" столбец был вычисляемым столбцом.
Теперь, если я использую DATEDIFF(month,[DateEngaged],GETDATE())
как формула в течение месяцев в обслуживании вычисляемый столбец, результаты корректны несколько раз и другие неправильные времена.
Каков был бы лучший надежный способ получить число месяцев между значением DateEngaged и текущей датой? Какую формулу я должен использовать в своем вычисляемом столбце?
Что-то вроде (возможно, понадобится поменять в обмен 1 и 0, непроверенным)
datediff(month,[DateEngaged],getdate()) +
CASE WHEN DATEPART(day, [DateEngaged]) < DATEPART(day, getdate()) THEN 1 ELSE 0 END
границы месяца измерения Datesiff, например, 00:00 на 1-й в каждом месяце, а не в день месяцы годовщины
Редактировать: после просмотра OP Комментарий, вы должны вычесть 1, если день начала> конечный день
DATEDIFF (month, DateEngaged, getdate()) -
CASE
WHEN DATEPART(day, DateEngaged) > DATEPART(day, getdate()) THEN 1 ELSE 0
END
, так что в течение 20 декабря до 13 января, Dateiff дает 1, а затем 20> 13, так что вычитает 1 = ноль месяцев.
Может быть, вы хотите что-то вроде:
(year(getdate())-year([DateEngaged]))*12+(month(getdate())-month([DateEngaged]))
Если Вы предполагаете, что месяц означает 30 дней, Вы можете также округлить долину
round((datediff(day,[DateEngaged],getdate()))/30.00,0)
Тот же подход, что и gbn, но с меньшим количеством нажатий клавиш :-)
SELECT
DATEDIFF(MONTH, DateEngaged, GETDATE()) +
CASE
WHEN DAY(DateEngaged) < DAY(GETDATE())
THEN 1
ELSE 0
END