如何获得休息时间

时间:2011-12-17 10:02:20

标签: sql sql-server sql-server-2000

ID Date Time

001 12/01/2011 08:00:00
001 12/01/2011 08:30:00
001 12/01/2011 11:30:00
001 12/01/2011 12:35:00
001 12/01/2011 03:30:00
001 12/01/2011 04:30:00
002 12/01/2011 08:30:00
002 12/01/2011 09:30:00
....

我想从表中选择intime,outtime,breakouttime,breakintime

Select id, date, min(time) as intime, max(time) as outtime from table group by id, date

以上查询适用于intime和outtime,但我想选择日期的休息时间和休息时间。

例如BreakOut时间在11:30:00到12:30:00之间意味着然后查询应检查从最小(Punchtime)到最大(Punchtime)在11:00:00到01:00:00之间的时间。

预期产出

Id Date intime outtime breakout breakin

001 08:00:00 04:30:00 11:30:00 12:35:00
002 08:30:00 09:30:00 null null 'so there is no punches between 11 to 1 for the break time, so break time should be null

如何查询上述条件

需要查询帮助

1 个答案:

答案 0 :(得分:3)

假设休息时间始终在上午11:00到下午1:00之间,您可以执行以下操作。基本上,使用CTE根据某些逻辑构建一个额外的“BreakTime”列。

为了使查询能够在12小时内显示您的数据,我在逻辑中做了(差)假设,在11:00到13:00之间,或者0:00和1:00之间的任何事情都是休息时间。在您的真实系统中,您应该使用24小时,这样您就不会有AM / PM模糊。此外,我不确定您需要2个单独的列来表示日期和时间。

但无论如何,因为这只是显示查询的示例代码,所以我不管它。

这是一个完整的示例,包含测试表和您的数据:

*更新为使用SQL 2000的派生表而不是CTE *

CREATE TABLE [dbo].[MyTable]
(
    ID nvarchar(5),
    MyDate date,
    MyTime time
)

insert into MyTable (ID, MyDate, MyTime) values ('001', '12/01/2011', '08:00:00')
insert into MyTable (ID, MyDate, MyTime) values ('001', '12/01/2011', '08:30:00')
insert into MyTable (ID, MyDate, MyTime) values ('001', '12/01/2011', '11:30:00')
insert into MyTable (ID, MyDate, MyTime) values ('001', '12/01/2011', '12:35:00')
insert into MyTable (ID, MyDate, MyTime) values ('001', '12/01/2011', '03:30:00')
insert into MyTable (ID, MyDate, MyTime) values ('001', '12/01/2011', '04:30:00')
insert into MyTable (ID, MyDate, MyTime) values ('002', '12/01/2011', '08:30:00')
insert into MyTable (ID, MyDate, MyTime) values ('002', '12/01/2011', '09:30:00')

select 
    ID, 
    MyDate, 
    min(MyTime) as intime, 
    max(MyTime) as outtime,
    min(BreakTime) as break_intime, 
    max(BreakTime) as break_outtime
FROM 
(
    SELECT *,
        CASE 
            WHEN (MyTime > '11:00:00' and MyTime < '13:00:00') THEN MyTime
            WHEN (MyTime > '0:00:00' and MyTime < '1:00:00') THEN MyTime
            ELSE null
        END AS BreakTime
    from MyTable 
) as DerivedTable
group by ID, MyDate

输出:

ID  MyDate  intime  outtime break_intime    break_outtime
001 2011-12-01  03:30:00.0000000    12:35:00.0000000    11:30:00.0000000    12:35:00.0000000
002 2011-12-01  08:30:00.0000000    09:30:00.0000000    NULL    NULL