




Попробуйте эту функцию
CREATE FUNCTION [dbo].[RoundTime] (@Time datetime, @RoundTo float)
RETURNS datetime
AS
BEGIN
DECLARE @RoundedTime smalldatetime
DECLARE @Multiplier float
SET @Multiplier= 24.0/@RoundTo
SET @RoundedTime= ROUND(CAST(CAST(CONVERT(varchar,@Time,121) AS datetime) AS float) * @Multiplier,0)/@Multiplier
RETURN @RoundedTime
END
select dbo.roundtime('13:15',0.5)
1-й параметр - это время, которое нужно округлить, а 2-й будет базисом в вашем списке (0,5 - полчаса, 1 - один час, ...)
Ничего не стоит указывать приращения в виде десятичных долей часа. Итак, если вы хотите округлить до 5-минутных интервалов, тогда это будет 1/12 часа, поэтому @RoundTo будет 0,083.
Спасибо, это полезно. Чтобы избежать проблем с вычислением числа с плавающей запятой, вы также можете вызвать такую функцию, чтобы округлить результат до 5 минут: SELECT dbo.RoundTime ('2016-11-28 10: 57: 50.000', CAST (5 AS float) / CAST (60 AS float)), где 5 - это количество минут, до которого нужно округлить, а 60 - общее количество минут в час (очевидно).
Обновление до «SET @ Multiplier = 1440.0 / @ RoundTo» позволяет указать минуты для округления в параметре @RoundTo. Также подумайте о замене Round () на Ceiling (), если вы хотите, чтобы ближайшее округленное время после ваше время ввода
Очень мило спасибо. Я использовал его для округления до 15 минут
convert(smalldatetime,ROUND(cast(TDatalog.Time as float) * (24/.25),0)/(24/.25)) AS RoundedTime
Если вы используете 121 вместо 113, он также получит правильную часть даты.