Для округления до ближайшего целого дня существует три подхода, которые широко используются. Первый использует datediff
, чтобы найти количество дней с даты 0
. 0
дата и время соответствуют 1 января 1900 года. Добавив разницу в днях к дате начала, вы округлились до целого дня;
select dateadd(d, 0, datediff(d, 0, getdate()))
Второй метод основан на тексте: он обрезает текстовое описание до varchar(10)
, оставляя только часть даты:
select convert(varchar(10),getdate(),111)
Третий метод использует тот факт, что datetime
действительно является плавающей точкой, представляющей количество дней с 1900 года. Таким образом, округляя его до целого числа, например, используя floor
, вы получаете начало дня :
select cast(floor(cast(getdate() as float)) as datetime)
Чтобы ответить на ваш второй вопрос, начало недели сложнее. Один из способов - вычесть день недели:
select dateadd(dd, 1 - datepart(dw, getdate()), getdate())
Это также возвращает часть времени, так что вам придется комбинировать ее с одним из методов разметки времени, чтобы добраться до первой даты. Например, с @start_of_day
в качестве переменной для удобства чтения:
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)
начало года, месяца, часа и минуты по-прежнему работает с подходом «разница с 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)
Округление до секунды требует другого подхода, поскольку количество секунд с 0
дает переполнение. Обходной путь - использование начала дня вместо 1900 года в качестве контрольной даты:
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)
Чтобы округлить на 5 минут , настройте метод округления в минутах. Возьмите коэффициент разницы минут, например, используя /5*5
:
select dateadd(mi, datediff(mi,0,getdate())/5*5, 0)
Это работает и на четверть с половиной часа.