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?

È stato utile?

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top