per arrotondare al più vicino intera giornata, ci sono tre approcci in largo uso. Il primo utilizza datediff
per trovare il numero di giorni dal 0
datetime. Il tempo di produzione 0
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 è testuale: tronca la descrizione testo con varchar(10)
, lasciando solo la parte data:
select convert(varchar(10),getdate(),111)
Il terzo metodo utilizza il fatto che un datetime
è davvero una virgola mobile che rappresenta il numero di giorni dal 1900. Quindi, arrotondandolo a un numero intero, ad esempio utilizzando floor
, si ottiene l'inizio della giornata:
select cast(floor(cast(getdate() as float)) as datetime)
Per rispondere alla seconda domanda, l'inizio della settimana è più complicato. Un modo è quello di sottrarre il giorno-of-the-settimana:
select dateadd(dd, 1 - datepart(dw, getdate()), getdate())
Questo restituisce una parte di tempo anche, in modo che avrebbe dovuto combinare con uno dei metodi tempo-stripping per arrivare al primo appuntamento . Ad esempio, con @start_of_day
come variabile per migliorare 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)
La inizio anno, il mese, l'ora ei minuti ancora lavorare con la "differenza dal 1900" approccio:
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)
Arrotondare al secondo richiede un approccio diverso, poiché il numero di secondi dal 0
dà un overflow. Un modo per aggirare che sta usando 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 giro di 5 minuti, regolare il metodo di arrotondamento minuto. Prendere il quoziente della differenza minuto, ad esempio utilizzando /5*5
:
select dateadd(mi, datediff(mi,0,getdate())/5*5, 0)
Questo funziona per i quarti e le mezze ore pure.
Ecco una domanda simile con una bella spiegazione: http://stackoverflow.com/questions/923295/how-to-truncate-a-datetime-in-sql-server – Alex