Om af te ronden op de dichtstbijzijnde hele dag , zijn er drie benaderingen die op grote schaal worden gebruikt. De eerste gebruikt datediff
om het aantal dagen te vinden sinds de 0
datum Tijd. De 0
datetime komt overeen met 1 januari 1900. Door het dagverschil toe te voegen aan de startdatum, heb je afgerond op een hele dag;
select dateadd(d, 0, datediff(d, 0, getdate()))
De tweede methode is op tekst gebaseerd:het kapt de tekstbeschrijving af met varchar(10)
, waarbij alleen het datumgedeelte overblijft:
select convert(varchar(10),getdate(),111)
De derde methode maakt gebruik van het feit dat een datetime
is echt een drijvende komma die het aantal dagen sinds 1900 vertegenwoordigt. Dus door het af te ronden op een geheel getal, bijvoorbeeld met behulp van floor
, je krijgt het begin van de dag:
select cast(floor(cast(getdate() as float)) as datetime)
Om uw tweede vraag te beantwoorden, het begin van de week is lastiger. Een manier is om de dag van de week af te trekken:
select dateadd(dd, 1 - datepart(dw, getdate()), getdate())
Dit retourneert ook een tijdsdeel, dus je zou het moeten combineren met een van de time-stripping-methoden om bij de eerste date te komen. Bijvoorbeeld met @start_of_day
als een variabele voor leesbaarheid:
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)
Het begin van het jaar, maand, uur en minuut werk nog steeds met de "verschil sinds 1900"-benadering:
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)
Afronding op seconde vereist een andere benadering, aangezien het aantal seconden sinds 0
geeft een overloop. Een manier om dat te omzeilen is het gebruik van het begin van de dag, in plaats van 1900, als referentiedatum:
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)
Om met 5 minuten af te ronden , pas de minutenafrondingsmethode aan. Neem het quotiënt van het minuutverschil, bijvoorbeeld met /5*5
:
select dateadd(mi, datediff(mi,0,getdate())/5*5, 0)
Dit werkt ook voor kwartieren en halve uren.