sql >> Databasteknik >  >> RDS >> Sqlserver

Vad är det bästa sättet att trunkera ett datum i SQL Server?

Att avrunda till närmaste hel dag , det finns tre tillvägagångssätt i stor användning. Den första använder datediff för att hitta antalet dagar sedan 0 datum Tid. 0 datetime motsvarar den 1 januari 1900. Genom att lägga till dagsskillnaden till startdatumet har du avrundat till en hel dag;

select dateadd(d, 0, datediff(d, 0, getdate()))

Den andra metoden är textbaserad:den trunkerar textbeskrivningen med varchar(10) , lämnar bara datumdelen:

select convert(varchar(10),getdate(),111)

Den tredje metoden använder det faktum att en datetime är verkligen en flyttal som representerar antalet dagar sedan 1900. Så genom att avrunda det till ett heltal, till exempel med floor , du får början på dagen:

select cast(floor(cast(getdate() as float)) as datetime)

För att svara på din andra fråga, veckans början är knepigare. Ett sätt är att subtrahera veckodagen:

select dateadd(dd, 1 - datepart(dw, getdate()), getdate())

Detta returnerar också en tidsdel, så du måste kombinera den med en av metoderna för att ta bort tid för att komma till första dejten. Till exempel med @start_of_day som variabel för läsbarhet:

declare @start_of_day datetime
set @start_of_day = cast(floor(cast(getdate() as float)) as datetime)
select dateadd(dd, 1 - datepart(dw, @start_of_day), @start_of_day)

början på året, månaden, timmen och minuten arbetar fortfarande med "skillnaden sedan 1900"-metoden:

select dateadd(yy, datediff(yy, 0, getdate()), 0)
select dateadd(m, datediff(m, 0, getdate()), 0)
select dateadd(hh, datediff(hh, 0, getdate()), 0)
select dateadd(mi, datediff(mi, 0, getdate()), 0)

Avrundning efter sekund kräver ett annat tillvägagångssätt, eftersom antalet sekunder sedan 0 ger ett överlopp. En väg runt det är att använda början av dagen, istället för 1900, som referensdatum:

declare @start_of_day datetime
set @start_of_day = cast(floor(cast(getdate() as float)) as datetime)
select dateadd(s, datediff(s, @start_of_day, getdate()), @start_of_day)

Att runda med 5 minuter , justera metoden för minutavrundning. Ta kvoten av minutskillnaden, till exempel med /5*5 :

select dateadd(mi, datediff(mi,0,getdate())/5*5, 0)

Detta fungerar också i kvart och halvtimme.



  1. Använder Robolectric med SQLiteAssetHelper

  2. Django + Psycopg2:InterfaceError:endast protokoll 3 stöds

  3. Databasbelastningsbalansering med ProxySQL &AWS Aurora

  4. Skapa en MySQL-användare på Linux via kommandoraden