簡體   English   中英

如何在存儲過程中的選擇中將記錄作為休息時間插入

[英]How to insert records as break times in a select in a Stored Procedure

Sql Server 2012擁有此表后,我需要返回在正確位置插入的休息時間。

如有必要,我可以使用臨時表。

休息:這是時間之間的時差,所以我需要一張代表差距的新記錄。

表:

╔════════════════╦════════════════╦══════════╦════════╗
║     Start      ║      End       ║ Duration ║  Type  ║
╠════════════════╬════════════════╬══════════╬════════╣
║ 1/06/2015 1:00 ║ 1/06/2015 1:30 ║ 0:30     ║ Logged ║
║ 1/06/2015 2:00 ║ 1/06/2015 3:00 ║ 1:00     ║ Logged ║
║ 1/06/2015 3:20 ║ 1/06/2015 4:00 ║ 0:40     ║ Logged ║
║ 1/06/2015 4:00 ║ NULL           ║          ║ Logged ║
╚════════════════╩════════════════╩══════════╩════════╝

結果:

╔════════════════╦════════════════╦══════════╦════════╗
║     Start      ║      End       ║ Duration ║  Type  ║
╠════════════════╬════════════════╬══════════╬════════╣
║ 1/06/2015 1:00 ║ 1/06/2015 1:30 ║ 0:30     ║ Logged ║
║ 1/06/2015 1:30 ║ 1/06/2015 2:00 ║ 0:30     ║ Break  ║
║ 1/06/2015 2:00 ║ 1/06/2015 3:00 ║ 1:00     ║ Logged ║
║ 1/06/2015 3:00 ║ 1/06/2015 3:20 ║ 0:20     ║ Break  ║
║ 1/06/2015 3:20 ║ 1/06/2015 4:00 ║ 0:40     ║ Logged ║
║ 1/06/2015 4:00 ║ NULL           ║          ║ Logged ║
╚════════════════╩════════════════╩══════════╩════════╝

這是一種解決方案:

DECLARE @t TABLE
    (
      StartTime DATETIME ,
      EndTime DATETIME,
      EmpID int    
    )

INSERT  INTO @t
VALUES  ( '1/06/2015 1:00', '1/06/2015 1:30', 1 ),
        ( '1/06/2015 2:00', '1/06/2015 3:00', 1 ),
        ( '1/06/2015 3:20', '1/06/2015 4:00', 1 ),
        ( '1/06/2015 4:00', NULL, 1 ),
        ( '1/06/2015 1:00', '1/06/2015 1:20', 2 ),
        ( '1/06/2015 2:10', '1/06/2015 3:10', 2 ),
        ( '1/06/2015 3:20', '1/06/2015 3:30', 2 )


SELECT  StartTime, EndTime, Duration, EmpID, Logged
FROM    ( SELECT    StartTime ,
                    EndTime ,
                    DATEDIFF(mi, StartTime, EndTime) AS Duration ,                  
                    EmpID,                  
                    'Logged' AS Logged,
                    1 AS IncludeRow                  
          FROM      @t
          UNION ALL
          SELECT    EndTime ,
                    LEAD(StartTime) OVER (PARTITION BY EmpID ORDER BY StartTime ) ,
                    DATEDIFF(mi, EndTime, LEAD(StartTime) OVER (PARTITION BY EmpID ORDER BY StartTime ) ) ,                 
                    EmpID,
                    'Break' AS Logged,
                    CASE WHEN EndTime IS NULL THEN 1 ELSE 0 END AS IncludeRow                  
          FROM      @t
        ) t
WHERE   (t.StartTime IS NOT NULL OR EndTime IS NOT NULL) AND (Duration > 0 OR t.IncludeRow = 1)
ORDER BY t.EmpID, t.StartTime

輸出:

StartTime               EndTime                 Duration    EmpID   Logged
2015-01-06 01:00:00.000 2015-01-06 01:30:00.000 30          1       Logged
2015-01-06 01:30:00.000 2015-01-06 02:00:00.000 30          1       Break
2015-01-06 02:00:00.000 2015-01-06 03:00:00.000 60          1       Logged
2015-01-06 03:00:00.000 2015-01-06 03:20:00.000 20          1       Break
2015-01-06 03:20:00.000 2015-01-06 04:00:00.000 40          1       Logged
2015-01-06 04:00:00.000 NULL                    NULL        1       Logged
2015-01-06 01:00:00.000 2015-01-06 01:20:00.000 20          2       Logged
2015-01-06 01:20:00.000 2015-01-06 02:10:00.000 50          2       Break
2015-01-06 02:10:00.000 2015-01-06 03:10:00.000 60          2       Logged
2015-01-06 03:10:00.000 2015-01-06 03:20:00.000 10          2       Break
2015-01-06 03:20:00.000 2015-01-06 03:30:00.000 10          2       Logged

你從表中選擇第一初始行,然后endtime從各行與startime對於下一行( LEAD窗函數)。 那么你是union荷蘭國際集團的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM