0

SQL Server に次のテーブルがあります。

UserId    Date                       Start Time              End Time
------------------------------------------------------------------------------------
20       2012-04-02 00:00:00.000     NULL                    2012-04-02 09:17:57.000
20       2012-04-02 00:00:00.000    2012-04-02 09:17:57.000  2012-04-02 09:57:55.000
20       2012-04-02 00:00:00.000    2012-04-02 09:57:55.000  2012-04-02 10:04:58.000
20       2012-04-02 00:00:00.000    2012-04-02 10:04:58.000  2012-04-02 10:21:40.000
20       2012-04-02 00:00:00.000    2012-04-02 10:22:15.000  2012-04-02 10:22:20.000
20       2012-04-02 00:00:00.000    2012-04-02 10:22:56.000  2012-04-02 10:23:33.000

開始時刻と終了時刻の差を見つけて、日付に基づいて差を合計したい

必要な出力は次のとおりです。

UserID    Time_Duration
-----------------------
 20           1:20:20      (this is example not actuals)

誰でもSQLクエリを書くのを手伝ってもらえますか..私は以下のクエリで試しました.

select sum(sub1.TotalSeconds / 3600) as [Hours], sum((sub1.TotalSeconds % 3600) / 60)
as [Minutes], 
sum((sub1.TotalSeconds % 3600) % 60) as [Seconds],sub1.Date
from
(
SELECT
  sub.UserID,
  sub.Date,   
sum(datepart(hour, sub.end_time-sub.start_time) * 3600) + sum(datepart(minute,        sub.end_time-sub.start_time) * 60) +
sum(datepart(second, sub.end_time-sub.start_time)) as TotalSeconds
from.......
) AS sub 
 group by sub.UserID,sub.Date,sub.start_time,sub.end_time)
  as sub1 group by sub1.Date;

次の結果が得られます

 Hours   Minutes Seconds     Date
 3      347      515    2012-04-02 00:00:00.000

しかし、60を超える場合は分を追加したいのですが、3 + 1時間などの時間にする必要があります。私が間違いを犯している場所で私を助けることができますか

4

3 に答える 3

2

こんにちは、これを見てください:

SQLFIDDLE

それは最も効率的ではなく、コードにとって醜いと思います。ただし、手順がわかるように横に置いてください。そこからヒントが得られるかもしれません。主に算術演算子を使用して結果を取得します。主にデータフローを示すために使用していたので、追加のフィールドがあります。パフォーマンスに関しては、他のアプローチがはるかに効率的であると確信しています。あなたが試すことができます。

クエリ:

select q.userid, t.date,
q.h + round((q.m + (q.s/60))/60,0) as hh,
round((q.m + (q.s/60)) mod 60,0) as mm,
q.s mod 60 as ss
from 
(select t.userid,t.date, 
sum(t.hours) as h,
sum(t.minutes) as m,
sum(t.seconds) as s
from (select userid,date,
TIMEDIFF(EndTime, StartTime) as duration,
TIMESTAMPDIFF(hour,starttime,endtime) as hours,
TIMESTAMPDIFF(minute,starttime,endtime) mod 60 as minutes,
TIMESTAMPDIFF(second,starttime,endtime) mod 60 seconds
from datestimes) as t
) as q
 ;

結果

  USERID    DATE                            HH  MM  SS
  20        April, 02 2012 00:00:00+0000    13  4   25

1 つのネストされたクエリのみで更新されたクエリ

実際には、ネストされた 1 つのクエリでこれを実現できます。この回答全体がMYSQL基づいているため、お詫び申し上げます。うまくいけば、構文を使用してそれを実装するためにロジックを取り出すことができSQL Serverます:)

select t.userid, t.date, 
(sum(t.hours) + round((sum(t.minutes) +
sum(t.seconds)/60)/60,0)) as h,
(round((sum(t.minutes) +
sum(t.seconds)/60) mod 60,0)) as m,
sum(t.seconds) mod 60 as s

from 

(select userid, date,
TIMEDIFF(EndTime, StartTime) as duration,
TIMESTAMPDIFF(hour,starttime,endtime) as hours,
TIMESTAMPDIFF(minute,starttime,endtime) mod 60 as minutes,
TIMESTAMPDIFF(second,starttime,endtime) mod 60 seconds
from datestimes) as t
 ;
于 2012-12-04T08:10:03.603 に答える
1
Declare @test table(start datetime,ende datetime)
insert into @test Values ('20120101 10:00','20120101 18:00')
insert into @test Values ('20120101 10:00','20120101 18:13')
insert into @test Values ('20120101 10:00','20120102 18:25')
insert into @test Values ('20120101 10:00','20120101 18:00')
insert into @test Values ('20120101 10:00','20120101 18:00')


Select 
FLOOR(Cast(Dummy as Float)) as Days
,DATEPART(Hour,dummy) as Hours
,DATEPART(MINUTE,dummy) as Minutes
,DATEPART(Second,dummy) as Seconds
from
(
Select 
DateAdd(second, SUM(DATEDIFF(SECOND,start,ende)),Cast(0 as Datetime)) as Dummy 
from @test
) a
于 2012-12-04T07:35:04.720 に答える
1

数学的にこれを行うことができます:

Select 
    CAST(DATEDIFF(SECOND, StartDate, EndDate) / 3600 as VARCHAR) + ':' + 
    CAST((DATEDIFF(SECOND, StartDate, EndDate) % 3600) / 60 as VARCHAR) + ':' + 
    CAST(DATEDIFF(SECOND, StartDate, EndDate) % 60 as VARCHAR) as DateDifference
From YourTable

DATEDIFF関数は、開始時刻と終了時刻の差を秒単位で整数値として返します。その値を 3600 または 60 で単純に割ると、時間または分が得られ、%を使用すると残りの値が得られます。

于 2012-12-04T07:39:01.303 に答える