表
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
如何查询上述条件
需要查询帮助
答案 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