【问题标题】:How to get a break time for the days如何获得休息时间
【发布时间】:2011-12-17 10:02:19
【问题描述】:

表格

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,但我想为日期选择 break outtime 和 break intime。

例如 BreakOut 时间在 11:30:00 到 12:30:00 之间意味着查询应该检查从 11:00:00 到 01:00:00 之间的 min(Punchtime) 和 max(Punchtime) 的时间。

预期输出

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

如何查询上述条件

需要查询帮助

【问题讨论】:

  • 你怎么知道 11:30 和 12:35 是休息时间?为什么不是 8:30 或 3:30?

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


【解决方案1】:

假设休息时间始终在上午 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

【讨论】:

  • CTE 在 SQL Server 2000 中不可用,但看起来很容易用派生表替换。
猜你喜欢
  • 2014-06-16
  • 2019-12-16
  • 1970-01-01
  • 1970-01-01
  • 2017-04-07
  • 2014-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多