我正在开发一个需要数据间隔的项目,例如
我的数据为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]
答案 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