我需要编写一个函数,在一列中将时间四舍五入,从原始小时开始(例如:23:33:00.0000000将是23:00),另一列中的时间向下舍入到下一个小时(例如: 23:33:00.0000000将是24:00)然后将这些新值插入新列。我在How to Round a Time in T-SQL的Stack Overflow上找到了这个函数,但我无法运行该函数。我不断收到此错误消息:'消息156,级别15,状态1,过程RoundTime,第11行关键字'SELECT'附近的语法不正确。'
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] ('23:33',0.0)
我也试过用SELECT dbo.roundtime('23:33',0.0)运行它,但仍然没有快乐。
所以我希望通过让这个函数运行来弄清楚如何缩短时间,但我甚至无法运行它。而且我不知道最好的方法是让小时回到最早的时刻。我是否只需要从时间戳中提取小时,然后将该小时插入新列中?或者有没有办法在运行中转换它,然后将其插入新列?我正在使用Sql Server 2008。
答案 0 :(得分:5)
该函数必须存在才能引用它。在函数声明后添加一个GO,将创建与用法分开。
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
GO
SELECT [dbo].[RoundTime] ('23:33',0.0)
答案 1 :(得分:0)
SET @Multiplier= 24.0/@RoundTo
您正在传递0.0
以获取值@RoundTo
如果您传入1.0
会怎样?
现在您已经运行了,请删除该功能并将其替换为:
CREATE FUNCTION [dbo].[RoundTime]
(
@Time datetime,
@RoundTo float
)
RETURNS datetime
AS
BEGIN
DECLARE @RoundedTime datetime
DECLARE @Multiplier float
SET @Multiplier= 24.0/@RoundTo
SET @RoundedTime= FLOOR(CAST(CAST(CONVERT(varchar,@Time,121) AS datetime) AS float) * @Multiplier)/@Multiplier
RETURN @RoundedTime
END
为@RoundedTime变量从smalldatetime切换到datetime会阻止它丢掉时间。将Round
更改为Floor
可以获得您正在寻找的第一个号码,并且您知道您总是会添加一个小时。您可能希望重命名该函数以匹配它现在正在执行的操作...
哦,第二个参数应该是1.0(SELECT [dbo].[RoundTime] ('23:33:45',1.0)
)
答案 2 :(得分:0)
我不确定为什么会出现语法错误,但是当我运行它时,我会得到除以零的错误。我不认为该函数意味着在第二个参数中以0运行。但是,我认为这让你无法向下舍入。在这种情况下,您可以使用1作为第二个参数,该参数向上舍入到下一个小时,然后执行dateadd -1小时返回。 (或增强功能)。