2010-01-13 21 views
5

Ho una colonna nella mia tabella 2005 sql server che dovrebbe contenere il numero di mesi in cui un dipendente è stato in servizio.come ottenere il numero in mesi tra due date in sql server 2005

Poiché ho anche la data in cui il dipendente era impegnato, voglio che la colonna "mesi_In_Servizio" sia una colonna calcolata.

Ora, se si utilizza DATEDIFF(month,[DateEngaged],GETDATE()) come formula per i mesi nella colonna calcolata dal servizio, i risultati sono corretti alcune volte e altre volte errate.

Quale sarebbe il modo più affidabile per ottenere il numero di mesi tra il valore DateEngaged e la data corrente? Quale formula dovrei usare nella mia colonna calcolata?

+0

Potrebbe fornire alcuni esempi di cosa intendi quando dici che a volte sono corretti e in qualche modo non sono loro. –

+0

Potrebbe riadattarmi per favore (modifica) e impostare sql-server-2005 (o anche solo sql-server)? Nota i trattini. Ci sono utenti qui che ignorano le domande di SQL Server (non le loro competenze) ma sono interessati alle domande SQL. –

+0

DateEngaged = '12/20/2009 " CurrentDate = '13/01/2010" Ciò mi dà mesi in servizio come 1 utilizzando "datediff" del mese (mese, [DataEngaged], getdate() + (1)) " Dà anche anni in servizio come 1 utilizzando la formula "datediff (year, [DateEngaged], getdate() + (1))" – StackTrace

risposta

12

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-of-mese anniversari

Edit: dopo aver visto il commento di OP, si deve sottrarre 1 se il giorno giorno di inizio> fine

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

così per 20 dicembre-13 gennaio, DATEDIFF dà 1 e poi 20> 13 in modo da sottrarre 1 = a zero mon THS.

+0

sembra funzionare correttamente, sto solo andando a testare di più solo nel caso. – StackTrace

+1

Hai mai provato cosa succede quando il dipendente si è fidanzato il 31 ottobre e la data corrente era il 30 novembre? Questa routine restituisce 0 mesi, ma in realtà, praticamente ogni esigenza aziendale che posso immaginare direbbe che è un mese. Ho trovato questo cercando una soluzione a quello stesso problema. Ancora in cerca ... – Ron

+0

Non è una soluzione brillante a ciò che @Ron sta spiegando? – toscanelli

1

Forse si vuole qualcosa di simile:

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

Se si presume che il mese è significato per 30 giorni è possibile anche Vale

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

voglio esattamente il mese a significare 30 giorni e dodici mesi di 30 giorni (ciascuno !!). – StackTrace

+5

Questo derive sempre più lontano col passare del tempo. Dopo 6 anni, l'errore è un mese intero, garantito – gbn

4

stesso approccio gbn, ma con meno battute: -

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