declare @dt datetime
set @dt = '09-22-2007 15:07:38.850'
select dateadd(mi, datediff(mi, 0, @dt), 0)
select dateadd(hour, datediff(hour, 0, @dt), 0)
sarà di ritorno
2007-09-22 15:07:00.000
2007-09-22 15:00:00.000
Quanto sopra tronca solo i secondi ei minuti, producendo i risultati richiesti nella domanda. Come ha sottolineato @OMG Ponies, se vuoi arrotondare per eccesso / per difetto, puoi aggiungere rispettivamente mezzo minuto o mezz'ora, quindi troncare:
select dateadd(mi, datediff(mi, 0, dateadd(s, 30, @dt)), 0)
select dateadd(hour, datediff(hour, 0, dateadd(mi, 30, @dt)), 0)
e otterrai:
2007-09-22 15:08:00.000
2007-09-22 15:00:00.000
Prima che il tipo di dati data fosse aggiunto in SQL Server 2008, avrei utilizzato il metodo sopra per troncare la parte dell'ora da un datetime per ottenere solo la data. L'idea è di determinare il numero di giorni tra il datetime in questione e un punto fisso nel tempo ( 0
, che implicitamente esegue il cast su 1900-01-01 00:00:00.000
):
declare @days int
set @days = datediff(day, 0, @dt)
e quindi aggiungi quel numero di giorni al punto temporale fisso, che ti dà la data originale con l'ora impostata su 00:00:00.000
:
select dateadd(day, @days, 0)
o più succintamente:
select dateadd(day, datediff(day, 0, @dt), 0)
Utilizzando un datepart diversa (ad esempio hour
, mi
) funzionerà di conseguenza.