Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Qual è il modo migliore per troncare una data in SQL Server?

Per arrotondare all'intera giornata più vicina , ci sono tre approcci ampiamente utilizzati. Il primo usa datediff per trovare il numero di giorni trascorsi da 0 appuntamento. Il 0 datetime corrisponde al 1 gennaio 1900. Aggiungendo la differenza di giorno alla data di inizio, hai arrotondato a un giorno intero;

select dateadd(d, 0, datediff(d, 0, getdate()))

Il secondo metodo è basato sul testo:tronca la descrizione del testo con varchar(10) , lasciando solo la parte della data:

select convert(varchar(10),getdate(),111)

Il terzo metodo utilizza il fatto che un datetime è in realtà una virgola mobile che rappresenta il numero di giorni trascorsi dal 1900. Quindi arrotondandolo a un numero intero, ad esempio usando floor , hai l'inizio della giornata:

select cast(floor(cast(getdate() as float)) as datetime)

Per rispondere alla tua seconda domanda, l'inizio della settimana è più complicato. Un modo è sottrarre il giorno della settimana:

select dateadd(dd, 1 - datepart(dw, getdate()), getdate())

Questo restituisce anche una parte temporale, quindi dovresti combinarla con uno dei metodi di eliminazione del tempo per arrivare alla prima data. Ad esempio, con @start_of_day come variabile per la leggibilità:

declare @start_of_day datetime
set @start_of_day = cast(floor(cast(getdate() as float)) as datetime)
select dateadd(dd, 1 - datepart(dw, @start_of_day), @start_of_day)

L'inizio dell'anno, mese, ora e minuto ancora lavorare con l'approccio "differenza dal 1900":

select dateadd(yy, datediff(yy, 0, getdate()), 0)
select dateadd(m, datediff(m, 0, getdate()), 0)
select dateadd(hh, datediff(hh, 0, getdate()), 0)
select dateadd(mi, datediff(mi, 0, getdate()), 0)

Arrotondamento per secondo richiede un approccio diverso, poiché il numero di secondi trascorsi da 0 dà un trabocco. Un modo per aggirare questo è utilizzare l'inizio della giornata, invece del 1900, come data di riferimento:

declare @start_of_day datetime
set @start_of_day = cast(floor(cast(getdate() as float)) as datetime)
select dateadd(s, datediff(s, @start_of_day, getdate()), @start_of_day)

Per arrotondare di 5 minuti , regolare il metodo di arrotondamento dei minuti. Prendi il quoziente della differenza minima, ad esempio utilizzando /5*5 :

select dateadd(mi, datediff(mi,0,getdate())/5*5, 0)

Funziona anche per quarti e mezz'ora.