4

これが意味をなさない場合は、最初に謝罪させてください。私はそれを書いて自分で理解するのに時間がかかりました。わかりにくいところがありましたら申し訳ありません。私はこれに不慣れで、説明するために最善を尽くしました。また、質問のタイトルが適切でない場合は、お詫び申し上げます。誰かがより良いタイトルを知っている場合は、編集するか、必要な変更を加えてください.

JOBS と PHASES の 2 つのテーブルがあります。

JOBS
Id
Job_Type (ex. 0 = import)
Title

PHASES
Id
Jobs_Id
Phase_Type
Title
Start_Time
End_Time
Duration

各 job/job_type は任意の数のフェーズを持つことができます - 各フェーズには開始、終了、および継続時間があります

PHASES テーブルからフィールド job_id、start_time、end_time、duration を選択し、各 job_type のすべての期間を合計したい (例: job_type = 0 はインポート ジョブ)

SELECT jobs_id, start_time, end_time, duration FROM phases 
JOIN jobs ON phase.jobs_id = jobs.id
WHERE jobs.job_type=0

return jobs_id start として最も早い開始時刻を返す end として最後の endtime を返す それらすべての合計期間を返す TotalDuration

例、次のデータが JOBS テーブルにあった場合 (Id、Job_Type、Title)

1, 0, Import

次のデータはPHASESテーブルにありました(id、job_id、phase_type、title、start、end、duration)

1, 1, 1, 0, Run Preprocessor, 10/18/2012 8:52 PM, 10/18/2012 9:00 PM, 00:08:00
2, 1, 2, 1, Massage Data, 10/18/2012 9:00 PM, 10/18/2012 9:05 PM, 00:05:00
3, 1, 3, 2, Run Postprocessor, 10/18/2012 9:05 PM, 10/18/2012 9:07 PM, 00:02:00

4, 2, 1, 0, Run Preprocessor, 10/18/2012 9:15 PM, 10/18/2012 9:20 PM, 00:05:00
5, 2, 2, 1, Massage Data, 10/18/2012 9:20 PM, 10/18/2012 9:25 PM, 00:05:00
6, 2, 3, 2, Run Postprocessor, 10/18/2012 9:30 PM, 10/18/2012 9:35 PM, 00:05:00

上記は、2 つのジョブ (job_type = 0) の情報 (フェーズ) を示しています。

フェーズを組み合わせて、最早開始日と最遅終了日、および合計期間を表示できる SQL ステートメントが必要です。この情報が返されることを期待します (Job_id、Start、End、TotalDuration)

 1, 10/18/2012 8:52 PM, 10/18/2012 9:07 PM, 00:05:00
 2, 10/18/2012 9:15 PM, 10/18/2012 9:35 PM, 00:15:00
4

2 に答える 2

1

合計期間が 1 日を超えないと仮定すると、これは機能します。HH:MM:SS1 日を超える場合は、期間列の の前に追加の式が必要になります。

select job_id,
       min(start_time) start_time,
       max(end_time) end_time,
       CONVERT(CHAR(8), max(end_time)-min(start_time), 8) totalduration
  from phases
 group by job_id

-- sample data --
create table phases (job_id int, start_time datetime, end_time datetime);
insert phases values (1, '20121019 12:45', '20121019 13:15');
insert phases values (1, '20121019 13:15', '20121019 13:45');
insert phases values (1, '20121019 14:00', '20121019 15:12');

-- result --
job_id  start_time               end_time                 totalduration
1       2012-10-19 12:45:00.000  2012-10-19 15:12:00.000  02:27:00
于 2012-10-19T01:26:11.197 に答える
0
DECLARE @jobs TABLE(
    jobid BIGINT NOT NULL
)

INSERT INTO @jobs (jobid)
VALUES (1)
, (2)
, (3)



DECLARE @phases TABLE(
    phaseId BIGINT NOT NULL,
    jobId BIGINT NOT NULL,
    startTime datetime not null,
    endTime datetime not null
)

INSERT INTO @phases (phaseId, jobId, startTime, endTime)
VALUES (1,1, '10/18/2012 8:52 PM', ' 10/18/2012 9:00 PM')
, (2, 1, '10/18/2012 9:00 PM', '10/18/2012 9:05 PM')
, (3, 1, '10/18/2012 9:05 PM', '10/18/2012 9:07 PM')
, (4, 2, '10/18/2012 9:15 PM', '10/18/2012 9:20 PM')
, (5, 2, '10/18/2012 9:20 PM', '10/18/2012 9:25 PM')
, (6, 2, '10/18/2012 9:30 PM', '10/18/2012 9:35 PM')


SELECT j.jobid, MIN(p.startTime) as startTime
, MAX(p.endTime) as endTime
, CONVERT(TIME(0),MAX(p.endTime)-MIN(p.startTime)) as duration
FROM @phases p
JOIN @jobs j ON j.jobid = p.jobId
GROUP BY j.jobid
于 2012-10-19T01:42:11.383 に答える