sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cuál es la mejor manera de truncar una fecha en SQL Server?

Para redondear al día entero más cercano , hay tres enfoques de amplio uso. El primero usa datediff para encontrar el número de días desde el 0 fecha y hora. El 0 datetime corresponde al 1 de enero de 1900. Al agregar la diferencia de días a la fecha de inicio, ha redondeado a un día completo;

select dateadd(d, 0, datediff(d, 0, getdate()))

El segundo método está basado en texto:trunca la descripción del texto con varchar(10) , dejando solo la parte de la fecha:

select convert(varchar(10),getdate(),111)

El tercer método utiliza el hecho de que un datetime es realmente un punto flotante que representa la cantidad de días desde 1900. Entonces, al redondearlo a un número entero, por ejemplo, usando floor , obtienes el comienzo del día:

select cast(floor(cast(getdate() as float)) as datetime)

Para responder a su segunda pregunta, el comienzo de la semana es más complicado Una forma es restar el día de la semana:

select dateadd(dd, 1 - datepart(dw, getdate()), getdate())

Esto también devuelve una parte de tiempo, por lo que tendría que combinarlo con uno de los métodos de eliminación de tiempo para llegar a la primera fecha. Por ejemplo, con @start_of_day como variable de legibilidad:

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)

El inicio del año, mes, hora y minuto Todavía trabajo con el enfoque de "diferencia 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)

Redondeo por segundo requiere un enfoque diferente, ya que el número de segundos desde 0 da un desbordamiento. Una forma de evitarlo es usar el comienzo del día, en lugar de 1900, como fecha de referencia:

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 redondear por 5 minutos , ajuste el método de redondeo de minutos. Toma el cociente de la diferencia de minutos, por ejemplo usando /5*5 :

select dateadd(mi, datediff(mi,0,getdate())/5*5, 0)

Esto también funciona durante cuartos y media hora.