1

複数の列があるテーブルがありますが、StartTime列の現在行とEndTime列の前行の違いを見つける必要があります。SQL:StartTime列の現在の行とEndTime列の前の行の違い

例は次のとおりです。

Batch Number Start Time End Time  Difference 

100004   8:00:00  8:03:30   
100005   8:05:00  8:07:00   00:01:30 
100006   8:08:40  8:15:00   00:01:40 
32141   8:18:00  8:22:45   00:03:00 
84230   8:25:10  8:33:42   00:02:25 
23444   8:40:00  8:43:00   00:06:18 
100001   8:50:00  8:52:00   00:07:00    

私はSQLに新しいので、SQL Server 2008 R2を使用しています。

シンプルセレクトクエリーで出力を手助けしてください。

+0

クラシック使用。それはSql Server 2012で導入されたことも悪いです。ここにいくつかのアイデアがあります:http://blog.sqlauthority.com/2011/11/24/sql-server-solution-to-puzzle-simulate-lead-and-lag-/ – vercelli

+0

"Start Time"と "End Time"はVarcharまたはDatetimeとして保存されていますか? –

+0

@Vercelli、Fine、SQL Server 2008R2で実現する他の方法はありますか? – Ruhaan

答えて

4
CREATE TABLE #Batches 
(
    BatchID  INT, 
    StartTime Datetime, 
    EndTime  Datetime, 
) 
INSERT INTO #Batches 
VALUES 
(100004,'2016-05-16 08:00:00','2016-05-16 08:03:30'), 
(100005,'2016-05-16 08:05:00','2016-05-16 08:07:00'), 
(100006,'2016-05-16 08:08:40','2016-05-16 08:15:00'), 
(32141 ,'2016-05-16 08:18:00','2016-05-16 08:22:45'), 
(84230 ,'2016-05-16 08:25:10','2016-05-16 08:33:42'), 
(23444 ,'2016-05-16 08:40:00','2016-05-16 08:43:00'), 
(100001,'2016-05-16 08:50:00','2016-05-16 08:52:00') 

;WITH CTE AS 
(
    SELECT 
    BatchID, 
    StartTime, 
    EndTime, 
    ROW_NUMBER() OVER (ORDER BY StartTime) AS Seq 
    FROM #Batches 
) 
SELECT 
    b.BatchID, 
    b.StartTime, 
    b.EndTime, 
    CONVERT(VARCHAR(20), DATEADD(SECOND,DATEDIFF(SECOND, bl.EndTime,b.StartTime),0),108) AS Diff, 
    DATEADD(SECOND,DATEDIFF(SECOND, bl.EndTime,b.StartTime),0) AS DiffDT 
FROM CTE AS b 
LEFT OUTER JOIN CTE AS bl ON bl.Seq = b.Seq - 1 -- Last batch 
ORDER BY b.StartTime 
+0

良い仕事、その仕事のために働く。 – Ruhaan

1

私はこのリンクに従いますhttp://blog.sqlauthority.com/2011/11/24/sql-server-solution-to-puzzle-simulate-lead-and-lag-without-using-sql-server-2012-analytic-function/ これはあなたに秒差を与えます。 LAG()関数の

;with cteMain as (
    select *, ROW_NUMBER() over (order by Start_time) sn 
     from table) 
select m.batch_number, sLag.End_date, m.Start_time, convert(varchar,DateAdd(Second,DATEDIFF(SECOND, sLag.End_date, m.Start_time),0),108) as time_diff 
    from cteMain as m LEFT OUTER JOIN cteMain AS sLag ON sLag.sn = m.sn-1 
order by m.batch_number 
+0

もっと良くなりましたが、EndTimeの前の行からStartTimeの現在の行を差し引く必要があります。また、それは時間のdiffrerenceだけを示し、完全な時間差ではありません。 – Ruhaan

+0

@Ruhaan私はそれを秒単位で表示するように更新しました。それは、現在の行StartTimeからEndTimeの前の行の間に日付を表​​示する必要があります。結果を投稿してください。 – vercelli

+0

うまく動作しますが、ちょうど秒差を表示しています.HH:MM:SS形式の違いを得ることは可能でしょうか? – Ruhaan

関連する問題