sql >> Databasteknik >  >> RDS >> Sqlserver

T-SQL datumtid avrundad till närmaste minut och närmaste timmar med hjälp av funktioner

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.



  1. Säkerhetskopiera SQL-databaser med VDP Advanced SQL Agent

  2. Hur man sammanfogar strängar i SQLite

  3. mysql-python installationsfel:Kan inte öppna inkludera filen 'config-win.h'

  4. Hur man skickar tabellvärdesparametrar till lagrad procedur från .net-kod