从分为两列的时间之间的时间差求和时间

时间:2018-11-27 10:34:41

标签: sql sql-server

我再次需要您的帮助。 我有一张看起来像这样的桌子:

EventData[]

所以我希望输出总结开始时间和结束时间之间的差异。 在这种情况下,输出将如下所示,并且应该仅在几分钟内:

Hour_start | Minute_start | Second_start | Hour_end | Minute_end | Second_end
10         | 10           | 00           | 10       | 15         | 30
11         | 12           | 00           | 11       | 14         | 47

我使用来自外部应用程序的T-SQL(MS SQL Server),不允许我使用@declare之类的东西。我只能使用标准查询,例如选择,创建,删除等。

4 个答案:

答案 0 :(得分:2)

第1步)解雇设计this table的人

步骤2)似乎做到了 1

  def update
    post = Post.find(params[:id])
    if post.update_attributes(message: params[:message], picture: 
       params[:picture])
      render_success(:ok, post, meta: { message: 'Post updated' })
    else
      render_error(422, post.errors, message: 'Failed to update post')
    end
  end

您可能会想将结果强制转换为declare @t table (Hour_start int, Minute_start int, Second_start int, Hour_end int, Minute_end int, Second_end int) insert into @t(Hour_start , Minute_start , Second_start , Hour_end , Minute_end , Second_end) values (10 , 10 , 00 , 10 , 15 , 30), (11 , 12 , 00 , 11 , 14 , 47) ;With Total as ( select SUM( DATEDIFF(second, DATEADD(hour,hour_start, DATEADD(minute,minute_start, DATEADD(second,second_start, CONVERT(time,'00:00:00')))), DATEADD(hour,hour_end, DATEADD(minute,minute_end, DATEADD(second,second_end, CONVERT(time,'00:00:00'))))) ) as Seconds from @t ) select CONVERT(varchar(10),Seconds/60) + ':' + RIGHT('00' + CONVERT(varchar(10),Seconds%60),2) from Total (应该首先在表中使用的类型)。不要这样time表示一天中的时间。结果是一个时间跨度。这是两个截然不同的(虽然很相关)的概念。

也许会有更快的方法来将这些列转换为time,但是我更喜欢显式的time,这使我们在做什么变得更清楚。


1 是的,此脚本中有一个CONVERT,您已经说过这是不允许的,但这只是为了使脚本自包含且可运行。 declaredeclare只是在设置您的示例数据。

答案 1 :(得分:1)

如果MS SQL SERVER版本为2012或更高版本,则可以使用TIMEFROMPARTS查找时间,也可以使用DATEDIFF查找差异。

CREATE TABLE #Times
(
    Hour_start INT
    ,Minute_start INT
    ,Second_start INT
    ,Hour_end INT
    ,Minute_end INT
    ,Second_end INT
)

INSERT INTO #Times VALUES
(10,10,00,10,15,30)
,(11,12,00,11,14,47)

SELECT   TIMEFROMPARTS(Hour_start,Minute_start,Second_start,0,0) StartTime
        ,TIMEFROMPARTS(Hour_end,Minute_end,Second_end,0,0) EndTime
        ,DATEDIFF(MINUTE,TIMEFROMPARTS(Hour_start,Minute_start,Second_start,0,0),TIMEFROMPARTS(Hour_end,Minute_end,Second_end,0,0)) TimeDifference
FROM #Times

答案 2 :(得分:0)

如果您以秒为单位进行时间数学运算,而没有内置任何SQL日期时间函数,并且假设两个时间都在同一天。

    select 
      concat(
         CAST(diffinSeconds/60 as Nvarchar(max)),
        ':',
         CAST(diffinseconds%60 as nvarchar(max)))
    from 
     (
       select diffinSeconds=
        SUM(
              (Hour_end  - Hour_start) *3600 + 
              (Minute_end-Minute_start) *60 + 
              (Second_end-Second_start)
            ) 
       from yourtable
   )t

答案 3 :(得分:0)

我的查询也找到了小时。

CREATE TABLE [dbo].[Startstop](
[Hour_start] [int] NULL,
[Minute_start] [int] NULL,
[Second_start] [int] NULL,
[Hour_end] [int] NULL,
[Minute_end] [int] NULL,
[Second_end] [int] NULL
) 

insert Startstop(Hour_start , Minute_start , Second_start ,
           Hour_end , Minute_end , Second_end) values
(10         , 10           , 00           , 10       , 15         , 30),
(11         , 12           , 00           , 11       , 14         , 47)

declare @TempTable Table (TotalSecond int,Hour int)
insert @TempTable
select sum((((Hour_end *3600)+(Minute_end * 60)+Second_end)  - ((Hour_start *3600)+ 
(Minute_start * 60)+Second_Start))) 
,sum((((Hour_end *3600)+(Minute_end * 60)+Second_end)  - ((Hour_start *3600)+ 
(Minute_start * 60)+Second_Start))/3600) Hour
from Startstop


select Hour, (TotalSecond-(Hour* 3600)) /60 Minute , TotalSecond - (Hour *3600) - 
((((TotalSecond-(Hour* 3600)) /60))*60) Second
from @TempTable

我正在使用2008