Para redondear a todo el día, existen tres enfoques de amplio uso. El primero usa datediff
para encontrar el número de días desde el 0
datetime. La fecha de 0
corresponde al 1 de enero de 1900. Al agregar la diferencia de días a la fecha de inicio, se redondea a un día completo;
select dateadd(d, 0, datediff(d, 0, getdate()))
El segundo método se basa el texto: se trunca el texto de descripción con varchar(10)
, dejando sólo la parte de 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 el número de días transcurridos desde el año 1900. por lo tanto redondeando a un número entero, por ejemplo usando floor
, se obtiene el inicio de la jornada:
select cast(floor(cast(getdate() as float)) as datetime)
Para responder a su segunda pregunta, el inicio de la semana es más complicado. Una forma es restar el día-de-semana:
select dateadd(dd, 1 - datepart(dw, getdate()), getdate())
Esto devuelve una parte demasiado tiempo, por lo que lo tienes que combinarlo con uno de los métodos tiempo-stripping para llegar a la primera fecha . Por ejemplo, con @start_of_day
como una variable para facilitar la lectura:
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 comienzo del año, mes, hora y minuto todavía trabajan con la "diferencia desde 1900" enfoque:
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 evitar que se utiliza el inicio de la jornada, 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 ronda por 5 minutos, ajustar el método de redondeo minutos. Tome el cociente de la diferencia de minutos, por ejemplo usando /5*5
:
select dateadd(mi, datediff(mi,0,getdate())/5*5, 0)
Esto funciona para los cuartos y medias horas también.
Aquí hay una pregunta similar con una buena explicación: http://stackoverflow.com/questions/923295/how-to-truncate-a-datetime-in-sql-server – Alex