Cómo obtener el número en los meses entre dos fechas en SQL Server 2005
-
20-09-2019 - |
Pregunta
Tengo una columna en mi tabla SQL Server 2005 que debería contener el número de meses que un empleado ha estado en servicio.
Como también tengo la fecha en que el empleado estaba comprometido, quiero que la columna "meses_in_service" sea una columna calculada.
Ahora si uso DATEDIFF(month,[DateEngaged],GETDATE())
Como la fórmula para los meses en la columna calculada del servicio, los resultados son correctos en algunas veces y otras veces incorrectas.
¿Cuál sería la mejor forma confiable de obtener el número de meses entre el valor de fecha y la fecha actual? ¿Qué fórmula debo usar en mi columna calculada?
Solución
Algo como (podría necesitar intercambiar el 1 y 0, no probado)
datediff(month,[DateEngaged],getdate()) +
CASE WHEN DATEPART(day, [DateEngaged]) < DATEPART(day, getdate()) THEN 1 ELSE 0 END
Medidas de fechas de los límites del mes, por ejemplo, la hora del 1 de cada mes, no los aniversarios del día del mes
EDITAR: Después de ver el comentario de OP, debe restar 1 si el día de inicio> finalizar el día
DATEDIFF (month, DateEngaged, getdate()) -
CASE
WHEN DATEPART(day, DateEngaged) > DATEPART(day, getdate()) THEN 1 ELSE 0
END
Entonces, durante el 20 de diciembre al 13 de enero, la fecha da 1 y luego 20> 13, así que reste 1 = cero meses.
Otros consejos
Mismo enfoque que GBN, pero con menos teclas :-)
SELECT
DATEDIFF(MONTH, DateEngaged, GETDATE()) +
CASE
WHEN DAY(DateEngaged) < DAY(GETDATE())
THEN 1
ELSE 0
END
Quizás quieras algo como:
(year(getdate())-year([DateEngaged]))*12+(month(getdate())-month([DateEngaged]))
Si supone que ese mes tiene un significado durante 30 días, también puede redondear Vale
round((datediff(day,[DateEngaged],getdate()))/30.00,0)