从一列时间表创建考勤视图(SQL Server 2008 R2)

时间:2019-03-20 07:07:52

标签: sql sql-server database sql-server-2008

我有来自SQL Server的出勤数据,必须将其分为两列(进出)。

这里是一个例子:

The Data

这是我想要的结果

enter image description here

查询:

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. 可能会加班,因此有时我们必须检查第二天的结帐数据。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

也许尝试从Ins到outs的左联接,并找到该intime之后的最早的时​​间。

以下示例(未经测试):

def foo():
    dict_1 = dict()
    dict_2 = dict()

    return dict_1, dict_2

# Do either one of the following (indexing or unpacking)

# Indexing a tuple
return_value = foo()
dict_1 = return_value[0]
dict_2 = return_value[1]

# Unpacking a tuple
dict_1, dict_2 = foo()