sql >> Database >  >> RDS >> Sqlserver

T-SQL datetime afgerond op de dichtstbijzijnde minuut en de dichtstbijzijnde uren met gebruik van functies

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.



  1. Stappen die u moet nemen als u een MySQL-storing heeft

  2. Hoe te modelleren voor eenvoudig databaseonderhoud

  3. Wat is de beste werkwijze voor primaire sleutels in tabellen?

  4. Sequentiehiaten in een tabel in Oracle vinden