Aby zaokrąglić do najbliższego cały dzień , w powszechnym użyciu są trzy podejścia. Pierwszy używa datediff
aby znaleźć liczbę dni od 0
data i godzina. 0
datetime odpowiada 1 stycznia 1900 roku. Dodając różnicę dni do daty początkowej, zaokrąglono do całego dnia;
select dateadd(d, 0, datediff(d, 0, getdate()))
Druga metoda jest oparta na tekście:obcina opis tekstowy za pomocą varchar(10)
, pozostawiając tylko część daty:
select convert(varchar(10),getdate(),111)
Trzecia metoda wykorzystuje fakt, że datetime
jest tak naprawdę liczbą zmiennoprzecinkową reprezentującą liczbę dni od 1900 r. Więc zaokrąglając ją do liczby całkowitej, na przykład za pomocą floor
, masz początek dnia:
select cast(floor(cast(getdate() as float)) as datetime)
Aby odpowiedzieć na drugie pytanie, początek tygodnia jest trudniejsze. Jednym ze sposobów jest odjęcie dnia tygodnia:
select dateadd(dd, 1 - datepart(dw, getdate()), getdate())
Zwraca to również część czasu, więc musisz połączyć ją z jedną z metod wyznaczania czasu, aby dostać się do pierwszej daty. Na przykład z @start_of_day
jako zmienna dla czytelności:
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)
Początek roku, miesiąca, godziny i minuty nadal pracuję z podejściem „różnica od 1900”:
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)
Zaokrąglanie o sekundę wymaga innego podejścia, ponieważ liczba sekund od 0
daje przepełnienie. Jednym ze sposobów jest użycie początku dnia zamiast 1900 jako daty odniesienia:
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)
Aby zaokrąglić o 5 minut , dostosuj metodę zaokrąglania minut. Weź iloraz różnicy minut, na przykład używając /5*5
:
select dateadd(mi, datediff(mi,0,getdate())/5*5, 0)
Działa to również przez kwadrans i pół godziny.