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?

¿Fue útil?

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top