2011-12-17 30 views
0

如何得到休息時間天

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 
.... 

我想選擇銀泰,outtime,breakouttime,從表

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

上述查詢工作銀泰和outtime breakintime,但我想選擇休息時間,並在日期之間休息。

對於實施例突圍時間是11點30分00秒之間,以12:30:00裝置然後查詢應該之間11:00:00到01:00:00檢查從分鐘(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 

如何使查詢上述條件

需要查詢幫助

+0

你怎麼知道的11:30和12:35都在突破,打破了時間?爲什麼不是8點半或3點半? – Bert 2011-12-17 10:35:45

回答

3

假設休息時間總是上午11:00和下午1:00之間,你可以做下面的事情。基本上,使用的CTE以製造根據一些邏輯一個額外的「課間」列。

爲了與它在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 
+0

的CTE不可用在SQL Server 2000,但看起來容易派生表來代替。 – 2011-12-17 18:31:07