假設休息時間總是上午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
你怎麼知道的11:30和12:35都在突破,打破了時間?爲什麼不是8點半或3點半? – Bert 2011-12-17 10:35:45