как получить число месяцев между двумя датами в sql server 2005

StackOverflow https://stackoverflow.com/questions/2054975

Вопрос

У меня есть столбец в таблице sql server 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

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

Редактировать:после просмотра комментария ОП вам нужно вычесть 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 = ноль месяцев.

Другие советы

Тот же подход, что и GBN, но с меньшими нажатиями :-)

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

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

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

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

round((datediff(day,[DateEngaged],getdate()))/30.00,0)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top