2008-10-30 10 views

Respuesta

28

Pruebe esta función

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) 

La primera parámetro es el momento de ser redondeada y la segunda será la base de su lista (0,5 de media hora, 1-una hora, ...)

+0

Si utiliza 121 en lugar de 113 que obtendrá el datepart correcta también – vzczc

+0

Lo sentimos, 121 en lugar de 114 – vzczc

+0

destacable que los incrementos deben especificarse como decimal notación de una fracción de hora. Entonces, si lo quiere redondeado a intervalos de 5 minutos, entonces eso es 1/12 de una hora, entonces @RoundTo sería .083. – eidylon

5

Muy buenas gracias. Lo utilicé en línea para redondear a 15 minutos

convert(smalldatetime,ROUND(cast(TDatalog.Time as float) * (24/.25),0)/(24/.25)) AS RoundedTime