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)
kommer tillbaka
2007-09-22 15:07:00.000
2007-09-22 15:00:00.000
Ovanstående avkortar bara sekunderna och minuterna, vilket ger de resultat som efterfrågas i frågan. Som @OMG Ponies påpekade, om du vill runda upp/ner kan du lägga till en halv minut respektive en halvtimme och sedan trunkera:
select dateadd(mi, datediff(mi, 0, dateadd(s, 30, @dt)), 0)
select dateadd(hour, datediff(hour, 0, dateadd(mi, 30, @dt)), 0)
och du får:
2007-09-22 15:08:00.000
2007-09-22 15:00:00.000
Innan datumdatatypen lades till i SQL Server 2008, skulle jag använda metoden ovan för att trunkera tidsdelen från en datetime för att bara få datumet. Tanken är att bestämma antalet dagar mellan det aktuella datumet och en fast tidpunkt (0
, som implicit castar till 1900-01-01 00:00:00.000
):
declare @days int
set @days = datediff(day, 0, @dt)
och lägg sedan till det antalet dagar till den fasta tidpunkten, vilket ger dig det ursprungliga datumet med tiden inställd på 00:00:00.000
:
select dateadd(day, @days, 0)
eller mer kortfattat:
select dateadd(day, datediff(day, 0, @dt), 0)
Använd en annan datumdel (t.ex. hour
, mi
) kommer att fungera därefter.