SQL数据间隔

时间:2017-05-16 02:15:15

标签: sql sql-server

我正在开发一个需要数据间隔的项目,例如

我的数据为DECLARE @Time datetime = 'Jan 1 1900 9:54AM',预期结果为1900-01-01 09:30:00,但此查询

ALTER 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

我得到了这个结果1900-01-01 10:00:00,请赐教你如何做到这一点。我正在使用SQL数据库btw。

编辑1:我使用0.5作为@RoundTo参数 编辑2:这就是我使用函数,CONVERT(varchar, CONVERT(time,[dbo].[RoundTime](CAST(CAST([INTERVAL] as datetime) as varchar),0.5)), 108) as [Interval]

的方法

3 个答案:

答案 0 :(得分:0)

声明您的函数返回datetime。这是日期/时间值的正确内部格式。

您可以在更新版本的SQL Server中使用format(),或类似:

convert(varchar(255), @RoundedTime, 109)

但是。 。 。在调用该函数之后执行此操作。该函数应返回datetime。您的格式只是一种演示格式。

答案 1 :(得分:0)

ALTER FUNCTION [dbo].[RoundTime](@Time datetime)
RETURNS smalldatetime
as
Begin

Declare @RoundedTime  smalldatetime
SET @RoundedTime=
(Select 
case when datepart(minute,@Time)=0 and  datepart(second,@Time)=0 then  convert(varchar(10),@Time,121) 
     when datepart(minute,@Time)>30 and  datepart(second,@Time)=0 then dateadd(mi,30,cast(convert(varchar(14),@Time,121)+'00' as datetime))
     when datepart(minute,@Time)=30 and  datepart(second,@Time)=0 then cast(convert(varchar(16),@Time,121) as datetime)
     when datepart(minute,@Time)<30 and  datepart(second,@Time)=0 then dateadd(mi,0,cast(convert(varchar(14),@Time,121)+'00' as datetime))
end as 'Date') 

return @RoundedTime

end 

答案 2 :(得分:0)

我用

更改了查询
 DECLARE @RoundedTime smalldatetime
 DECLARE @Multiplier float

 SET @Multiplier= 24.0/@RoundTo

 SET @RoundedTime= DATEADD(mi, DATEDIFF(mi, 0, @Time)/30*30, 0)

 RETURN @RoundedTime