2010-01-13 13 views
5

Tengo una columna en mi tabla sql server 2005 que debe contener el número de meses que un empleado ha estado en servicio.cómo obtener el número en meses entre dos fechas en el servidor sql 2005

Como también tengo la fecha en que el empleado estuvo involucrado, quiero que la columna "months_In_Service" sea una columna calculada.

Ahora, si uso DATEDIFF(month,[DateEngaged],GETDATE()) como la fórmula para los meses en la columna de servicio computarizado, los resultados son correctos algunas veces y otras veces incorrectos.

¿Cuál sería la forma más confiable de obtener el número de meses entre el valor de Fecha de vigencia y la fecha actual? ¿Qué fórmula debo usar en mi columna calculada?

+0

Podría dar algunos ejemplos de lo que quiere decir cuando dice que a veces son correctos y no son ellos. –

+0

¿Podría por favor retomar esto (editar) y establecer sql-server-2005 (o incluso solo sql-server)? Tenga en cuenta los guiones. Aquí hay usuarios que ignoran las preguntas de SQL Server (no su experiencia) pero están interesados ​​en las preguntas de SQL. –

+0

DateEngaged = '12/20/2009 " CurrentDate = '1/13/2010" Eso me da meses en servicio como 1 usando formulário "datediff (month, [DateEngaged], getdate() + (1))" También da años en servicio como 1 usando la fórmula "datediff (year, [DateEngaged], getdate() + (1))" – StackTrace

Respuesta

12

Algo así (puede que tenga que cambiar el 1 y 0, no probado)

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

medida DATEDIFF límites mes, por ejemplo, 00:00 vez el 1 de cada mes, no el día de mes aniversarios

Editar: después de ver el comentario de OP, hay que restar 1 si el día día de inicio> extremo

DATEDIFF (month, DateEngaged, getdate()) - 
CASE 
    WHEN DATEPART(day, DateEngaged) > DATEPART(day, getdate()) THEN 1 ELSE 0 
END 

así que para el 20 de Dic al 13-ene-DATEDIFF da 1 y luego 20> 13, de manera restar 1 = cero mon ths.

+0

esto parece funcionar correctamente, solo voy a probarlo más por si acaso. – StackTrace

+1

¿Alguna vez ha probado lo que sucede cuando el empleado contrató el 31 de octubre y la fecha actual fue el 30 de noviembre? Esta rutina devuelve 0 meses, pero de hecho, prácticamente todos los requisitos comerciales que pueda imaginar dirían que es un mes. Encontré esto buscando una solución a ese mismo problema. Sigue buscando ...... – Ron

+0

¿No es una solución brillante a lo que @Ron está explicando? – toscanelli

1

Tal vez usted quiere algo como:

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

Si usted suponer que el mes es significado por 30 días También puede valle

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

quiero exactamente un mes para significar 30 días y un año para doce meses de 30 días (¡¡cada uno !!). – StackTrace

+5

Esto se desplaza cada vez más a medida que pasa el tiempo. Después de 6 años, el error es un mes completo, garantizado – gbn

4

El mismo que GBN, pero con menos pulsaciones de teclas: -)

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