Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Qual é a melhor maneira de truncar uma data no SQL Server?


Para arredondar para o dia inteiro mais próximo , existem três abordagens amplamente utilizadas. O primeiro usa datediff para encontrar o número de dias desde o 0 data hora. O 0 datetime corresponde a 1º de janeiro de 1900. Adicionando a diferença de dia à data de início, você arredonda para um dia inteiro;
select dateadd(d, 0, datediff(d, 0, getdate()))

O segundo método é baseado em texto:ele trunca a descrição do texto com varchar(10) , deixando apenas a parte da data:
select convert(varchar(10),getdate(),111)

O terceiro método usa o fato de que um datetime é realmente um ponto flutuante que representa o número de dias desde 1900. Então, arredondando-o para um número inteiro, por exemplo, usando floor , você começa o dia:
select cast(floor(cast(getdate() as float)) as datetime)

Para responder à sua segunda pergunta, o início da semana é mais complicado. Uma maneira é subtrair o dia da semana:
select dateadd(dd, 1 - datepart(dw, getdate()), getdate())

Isso também retorna uma parte de tempo, então você teria que combiná-lo com um dos métodos de desmembramento de tempo para chegar à primeira data. Por exemplo, com @start_of_day como uma variável para legibilidade:
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)

O início do ano, mês, hora e minuto ainda trabalham com a abordagem "diferença desde 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)

Arredondamento por segundo requer uma abordagem diferente, pois o número de segundos desde 0 dá um estouro. Uma maneira de contornar isso é usar o início do dia, em vez de 1900, como data de referência:
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)

Para arredondar em 5 minutos , ajuste o método de arredondamento dos minutos. Pegue o quociente da diferença de minutos, por exemplo, usando /5*5 :
select dateadd(mi, datediff(mi,0,getdate())/5*5, 0)

Isso funciona para quartos e meia hora também.