come ottenere il numero sulla mesi tra due date in SQL Server 2005
-
20-09-2019 - |
Domanda
Ho una colonna nel mio sql server tavolo 2005, che dovrebbe tenere il numero di mesi un dipendente è in servizio.
Dal momento che ho anche la data in cui il lavoratore è stato assunto, voglio la colonna "months_In_Service" per essere una colonna calcolata.
Ora, se io uso DATEDIFF(month,[DateEngaged],GETDATE())
come la formula per i mesi di servizio calcolata colonna, i risultati sono corretti alcuni orari e altre volte non corretta.
Quale sarebbe il modo migliore affidabile per ottenere il numero di mesi tra il valore DateEngaged e la data corrente? Quale formula devo usare nella mia colonna calcolata?
Soluzione
Qualcosa di simile (potrebbe aver bisogno di scambiare l'1 e 0, non testato)
datediff(month,[DateEngaged],getdate()) +
CASE WHEN DATEPART(day, [DateEngaged]) < DATEPART(day, getdate()) THEN 1 ELSE 0 END
Misura DATEDIFF mese confini ad esempio 0:00 tempo il 1 ° di ogni mese, non il giorno-di-mese anniversari
Modifica: dopo aver visto il commento di OP, si deve sottrarre 1 se il giorno di inizio> giorno end
DATEDIFF (month, DateEngaged, getdate()) -
CASE
WHEN DATEPART(day, DateEngaged) > DATEPART(day, getdate()) THEN 1 ELSE 0
END
Quindi, per 20 Dicembre - 13 Gennaio, DATEDIFF dà 1 e poi 20> 13 in modo da sottrarre 1 = a zero mesi.
Altri suggerimenti
Lo stesso approccio gbn, ma con meno battute: -)
SELECT
DATEDIFF(MONTH, DateEngaged, GETDATE()) +
CASE
WHEN DAY(DateEngaged) < DAY(GETDATE())
THEN 1
ELSE 0
END
Forse si vuole qualcosa di simile:
(year(getdate())-year([DateEngaged]))*12+(month(getdate())-month([DateEngaged]))
Se si presume che il mese è significato per 30 giorni è possibile Vale anche rotondo
round((datediff(day,[DateEngaged],getdate()))/30.00,0)