T-SQL datetime округляется до ближайшей минуты и ближайших часов с использованием функций
в SQL server 2008 я хотел бы округлить столбец datetime до ближайшего часа и ближайшей минуты предпочтительно с существующими функциями в 2008 году.
значение колонки 2007-09-22 15:07:38.850
выход будет выглядеть так:
2007-09-22 15:08 -- nearest minute
2007-09-22 15 -- nearest hour
2 ответа:
declare @dt datetime set @dt = '09-22-2007 15:07:38.850' select dateadd(mi, datediff(mi, 0, @dt), 0) select dateadd(hour, datediff(hour, 0, @dt), 0)
вернутся
2007-09-22 15:07:00.000 2007-09-22 15:00:00.000
выше просто усекает секунды и минуты, производя результаты, заданные в вопросе. Как отметил @OMG Ponies, если вы хотите округлить вверх / вниз, то вы можете добавить полминуты или полчаса соответственно, а затем усечь:
select dateadd(mi, datediff(mi, 0, dateadd(s, 30, @dt)), 0) select dateadd(hour, datediff(hour, 0, dateadd(mi, 30, @dt)), 0)
и вы получите:
2007-09-22 15:08:00.000 2007-09-22 15:00:00.000
до дата тип данных был добавлен в SQL Server 2008, я бы использовал приведенный выше метод для усечения часть времени от даты и времени, чтобы получить только дату. Идея состоит в том, чтобы определить количество дней между рассматриваемой датой и фиксированной точкой во времени (
0
, что неявно приводит к1900-01-01 00:00:00.000
):declare @days int set @days = datediff(day, 0, @dt)
а затем добавьте это количество дней к фиксированной точке во времени, что дает вам исходную дату с временем, установленным в
00:00:00.000
:select dateadd(day, @days, 0)
или более лаконично:
select dateadd(day, datediff(day, 0, @dt), 0)
использование другой части даты (например,
hour
,mi
) будет работайте соответственно.