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)
zal terugkeren
2007-09-22 15:07:00.000
2007-09-22 15:00:00.000
Het bovenstaande kapt alleen de seconden en minuten af, waardoor de in de vraag gevraagde resultaten worden verkregen. Zoals @OMG Ponies opmerkte, als je naar boven/beneden wilt afronden, kun je respectievelijk een halve minuut of een half uur toevoegen en vervolgens afkappen:
select dateadd(mi, datediff(mi, 0, dateadd(s, 30, @dt)), 0)
select dateadd(hour, datediff(hour, 0, dateadd(mi, 30, @dt)), 0)
en je krijgt:
2007-09-22 15:08:00.000
2007-09-22 15:00:00.000
Voordat het datumgegevenstype in SQL Server 2008 werd toegevoegd, zou ik de bovenstaande methode gebruiken om het tijdgedeelte van een datetime af te kappen om alleen de datum te krijgen. Het idee is om het aantal dagen te bepalen tussen de betreffende datetime en een vast tijdstip (0
, die impliciet cast naar 1900-01-01 00:00:00.000
):
declare @days int
set @days = datediff(day, 0, @dt)
en voeg dan dat aantal dagen toe aan het vaste tijdstip, wat je de originele datum geeft met de tijd ingesteld op 00:00:00.000
:
select dateadd(day, @days, 0)
of beknopter:
select dateadd(day, datediff(day, 0, @dt), 0)
Een ander datumdeel gebruiken (bijv. hour
, mi
) zal dienovereenkomstig werken.