【问题标题】:SUM MULTIPLE TIMES HH:MM SQL SERVERSUM 多次 HH:MM SQL SERVER
【发布时间】:2016-12-30 06:46:44
【问题描述】:

我需要以格式(hh:mm) 多次添加。我需要编写一个函数/存储过程,它可以接受多个参数作为输入并返回总和时间。

function addTimes(<input1>,<input2>...) //input can be multiple 2,3,4,5..
{
  input1 = 01:00
  input2 = 02:00
  input3 = 03:00
  return 06:00
}

无论如何我都必须调用上面的 addTimes 函数,我在下面从另一个存储过程中提到过。

dbo.addTimes(01:00) //return 01:00
dbo.addTimes(01:00,02:00) //return 03:00
dbo.addTimes(01:00,02:00,03:00) //return 06:00

请帮助并向我提出一些想法。 SQL 服务器。

【问题讨论】:

  • 我觉得我可以对可选参数使用默认值,并将所有 hh:mm 转换为函数内部的分钟数,然后在函数内部再次转换为 hh:mm 并返回。这是正确的方法还是其他优雅的方法?

标签: sql sql-server sql-server-2008


【解决方案1】:
    CREATE FUNCTION [dbo].[addTimes] (
       @TimeSerial VARCHAR(8000)     
    )

    RETURNS varchar(100)


    AS
    BEGIN
      DECLARE @xml XML
        SET @xml='<n>'+REPLACE(@TimeSerial,',','</n><n>')+'</n>'
        DECLARE @s VARCHAR(100)
        SELECT @s=CONVERT(VARCHAR, DATEADD(MINUTE, SUM(DATEDIFF(MINUTE,0,s.b.value('.','time'))),0),108) FROM @xml.nodes('n') s(b)
        RETURN @s

    END -- End Function

    SELECT dbo.[addTimes]('01:00,02:00,03:00,,09:00')

--15:00:00

【讨论】:

    【解决方案2】:

    创建如下函数

    CREATE FUNCTION [dbo].[ReturnTime] (
       @InputString VARCHAR(8000)     
    )
    
    RETURNS @Items1 TABLE (
          Item time
    )
    
    AS
    BEGIN
    
    DECLARE @Items TABLE(Item VARCHAR(8000))
    declare @Delimiter VARCHAR(50)=','
    
          IF @Delimiter = ' '
          BEGIN
                SET @Delimiter = ','
                SET @InputString = REPLACE(@InputString, ' ', @Delimiter)
          END
    
          IF (@Delimiter IS NULL OR @Delimiter = '')
                SET @Delimiter = ','
    
          DECLARE @Item time
          DECLARE @ItemList VARCHAR(8000)
          DECLARE @DelimIndex INT
    
          SET @ItemList = @InputString
          SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0)
          WHILE (@DelimIndex != 0)
          BEGIN
                SET @Item = SUBSTRING(@ItemList, 0, @DelimIndex)
                INSERT INTO @Items VALUES (@Item)
    
                -- Set @ItemList = @ItemList minus one less item
                SET @ItemList = SUBSTRING(@ItemList, @DelimIndex+1, LEN(@ItemList)-@DelimIndex)
                SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0)
          END -- End WHILE
    
          IF @Item IS NOT NULL -- At least one delimiter was encountered in @InputString
          BEGIN
                SET @Item = @ItemList
                INSERT INTO @Items VALUES (@Item)
          END
    
          -- No delimiters were encountered in @InputString, so just return @InputString
          ELSE INSERT INTO @Items VALUES (@InputString)
    
          INSERT INTO @Items1
          SELECT Cast (DateAdd (S, Sum (DATEDIFF (S, '00:00:00', item)), '00:00:00') as Time) FROM @Items
    
          RETURN
    
    END -- End Function
    

    查询

    select SUBSTRING(convert(varchar, item,108),1,5) from dbo.ReturnTime('01:00') --//return 01:00
    select SUBSTRING(convert(varchar, item,108),1,5) from dbo.ReturnTime('01:00,02:00')-- //return 03:00
    select SUBSTRING(convert(varchar, item,108),1,5) from dbo.ReturnTime('01:00,02:00,03:00') --//return 06:00
    

    【讨论】:

    • @srinath- 非常感谢,但我需要返回结果,例如 hh:mm '01:00' 但我得到的是 01:00:00.0000000。
    • @srinath- 如果我多次添加,我不会得到想要的结果。
    • 00:00 00:00 00:00 07:40 08:13 08:05 06:53 00:00 .如果我添加这个我得到 06:41 的那种。我需要所有时间的总和
    • 我在稍作修改后得到所需的结果。返回@Items1 表(项目 varchar(8000))--- SELECT CAST(i.time_sum/3600 AS VARCHAR(2)) + ':'+ CAST(i.time_sum%3600/60 AS VARCHAR(2)) FROM ( SELECT SUM(DATEDIFF(S, '00:00:00', item)) AS time_sum FROM @Items) i
    【解决方案3】:

    你可以试试下面的方法

    Declare @tbl table(tm time)
    insert into @tbl values('0:10')
    insert into @tbl values('3:20')
    insert into @tbl values('1:00')
    
    declare @query varchar(max)
    set @query= (Select  Stuff(
            (
            Select '+CAST(''' + LEFT(CAST(tm as varchar(50)),5) +''' AS DATETIME)'
            From @tbl
            For Xml Path('')
      ), 1, 1, ''))
    
    SET @query ='SELECT LEFT(CAST('+@query +' As Time),5)'
    
    exec(@query)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-25
      • 2020-08-05
      • 2011-05-18
      • 1970-01-01
      相关资源
      最近更新 更多