At runde til nærmeste hele dag , er der tre tilgange i bred brug. Den første bruger datediff
for at finde antallet af dage siden 0
dato tid. 0
datetime svarer til den 1. januar 1900. Ved at lægge dagsforskellen til startdatoen, har du afrundet til en hel dag;
select dateadd(d, 0, datediff(d, 0, getdate()))
Den anden metode er tekstbaseret:den afkorter tekstbeskrivelsen med varchar(10)
, så kun datodelen er tilbage:
select convert(varchar(10),getdate(),111)
Den tredje metode bruger det faktum, at en datetime
er virkelig et flydende komma, der repræsenterer antallet af dage siden 1900. Så ved at afrunde det til et helt tal, for eksempel ved at bruge floor
, får du starten på dagen:
select cast(floor(cast(getdate() as float)) as datetime)
For at besvare dit andet spørgsmål, ugens start er vanskeligere. En måde er at trække ugedagen fra:
select dateadd(dd, 1 - datepart(dw, getdate()), getdate())
Dette returnerer også en tidsdel, så du bliver nødt til at kombinere den med en af de time-stripping metoder for at komme til den første date. For eksempel med @start_of_day
som en variabel for læsbarhed:
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)
årets begyndelse, måned, time og minut arbejder stadig med "forskel siden 1900"-tilgangen:
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)
Afrunding efter sekund kræver en anden tilgang, da antallet af sekunder siden 0
giver overløb. En vej rundt er at bruge starten af dagen i stedet for 1900 som referencedato:
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)
At runde med 5 minutter , juster minutafrundingsmetoden. Tag kvotienten af minutforskellen, for eksempel ved at bruge /5*5
:
select dateadd(mi, datediff(mi,0,getdate())/5*5, 0)
Dette virker også i kvarter og halve timer.