簡體   English   中英

從一列時間表創建考勤視圖(SQL Server 2008 R2)

[英]Create an Attendance view from one column timesheet (SQL Server 2008 R2)

我有來自SQL Server的出勤數據,我必須將其分為2列(進出)。

這是一個例子:

數據

這就是我想要的結果

在此處輸入圖片說明

查詢:

CREATE TABLE [dbo].[Table1]
(
    [ID] [varchar](50) NULL,
    [DATETIME] [datetime] NULL,
    [Flag] [int] NULL
)

INSERT INTO table1 
VALUES ('ID-1', '2019-03-13 09:48:00.000', '2'),
       ('ID-1', '2019-03-13 09:48:00.000', '2'),
       ('ID-1', '2019-03-13 18:11:00.000', '3'),
       ('ID-1', '2019-03-13 18:11:00.000', '3'),
       ('ID-1', '2019-03-14 02:00:00.000', '3'),
       ('ID-1', '2019-03-14 09:54:00.000', '2'),
       ('ID-1', '2019-03-14 09:54:00.000', '2'),
       ('ID-1', '2019-03-14 09:54:00.000', '2'),
       ('ID-1', '2019-03-14 22:00:00.000', '3'),
       ('ID-1', '2019-03-14 22:00:00.000', '3'),
       ('ID-1', '2019-03-14 22:00:00.000', '3'),
       ('ID-1', '2019-03-15 13:55:00.000', '2'),
       ('ID-1', '2019-03-15 13:55:00.000', '2'),
       ('ID-1', '2019-03-15 13:55:00.000', '2'),
       ('ID-1', '2019-03-15 13:55:00.000', '2'),
       ('ID-1', '2019-03-15 13:55:00.000', '2'),
       ('ID-1', '2019-03-15 22:00:00.000', '3'),
       ('ID-1', '2019-03-15 22:00:00.000', '3'),
       ('ID-1', '2019-03-15 22:00:00.000', '3'),
       ('ID-1', '2019-03-15 22:00:00.000', '3')

注意:

  1. 標志2表示IN,3表示OUT。

  2. 可以有多個簽入和簽出,所以我們必須先入后出。

  3. 可能會有加班,因此有時我們必須從第二天開始檢查結帳數據。

我怎樣才能做到這一點?

也許嘗試從Ins到outs的左聯接,並找到該intime之后最早的時間。

以下示例(未試用):

WITH ins
AS ( SELECT *
     FROM   table1
     WHERE  Flag = 2 )
    ,outs
AS ( SELECT *
     FROM   table1
     WHERE  Flag = 3 )
SELECT   i.ID
        ,i.DATETIME InTime
        ,MIN(o.DATETIME) OutTime
FROM     ins i
         LEFT JOIN outs o ON o.ID = i.ID AND o.DATETIME > i.DATETIME -- out must be later than in
GROUP BY i.ID
        ,i.DATETIME
        ,i.Flag;

暫無
暫無

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

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