1

我需要编写一个函数,在一个列中舍入时间以从其原始时间开始(例如:23:33:00.0000000 将是 23:00)并在另一列中舍入到下一个小时(例如:23:33 :00.0000000 将是 24:00),然后将这些新值插入到新列中。我在 Stack Overflow 上的How to Round a Time in T-SQL 中找到了这个函数,但我无法运行该函数。我不断收到此错误消息:'Msg 156,Level 15,State 1,Procedure RoundTime,Line 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。

4

3 回答 3

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)
于 2012-04-24T20:05:16.893 回答
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 可以阻止它浪费时间。更改RoundFloor让您获得您正在寻找的第一个号码,并且您知道您总是会增加一个小时。您可能想要重命名该函数以匹配它现在正在执行的操作...

哦,第二个参数应该是 1.0 ( SELECT [dbo].[RoundTime] ('23:33:45',1.0))

于 2012-04-24T20:05:06.913 回答
0

我不确定你为什么会得到语法错误,但是当我运行它时,我得到一个除以零的错误。我不认为该函数应该在第二个参数中使用 0 运行。但这让你无法四舍五入我认为。在这种情况下,您可以只使用 1 作为第二个参数,该参数向上舍入到下一个小时,然后执行 dateadd -1 小时返回。(或增强功能)。

于 2012-04-24T20:19:05.373 回答