За закръгляване до най-близкия цял ден , има три широко използвани подхода. Първият използва datediff
за да намерите броя дни след 0
Време за среща. 0
datetime съответства на 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)
Това работи и за четвърт час и половина.