T-SQL的问题是将时间缩短到最早的小时

时间:2012-04-24 20:01:17

标签: sql sql-server-2008 tsql datetime

我需要编写一个函数,在一列中将时间四舍五入,从原始小时开始(例如: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。

3 个答案:

答案 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小时返回。 (或增强功能)。