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)
tornerà
2007-09-22 15:07:00.000
2007-09-22 15:00:00.000
Quanto sopra tronca solo secondi e 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 della data fosse aggiunto in SQL Server 2008, avrei usato il metodo precedente per troncare la parte temporale da un datetime per ottenere solo la data. L'idea è di determinare il numero di giorni tra la data e l'ora in questione e un punto temporale fisso (0
, che esegue il cast implicito in 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 una datapart diversa (ad es. hour
, mi
) funzionerà di conseguenza.