如何统计上班时间(去除休息时间)

烟灰洒落键盘 2012-08-14 09:14:21
START_TIME FINISH_TIME
2012-07-12 08:30:00.000 2012-07-12 21:00:00.000
2012-07-13 08:01:00.000 2012-07-13 08:33:00.000
2012-07-16 08:30:00.000 2012-07-16 08:52:00.000
2012-07-17 08:21:00.000 2012-07-17 21:30:00.000
2012-07-18 08:30:00.000 2012-07-18 21:30:00.000

中午的休息时间是11:30- 12:30
下午休息时间是17:30-18:00

如何统计每天的上班时间,自动扣除到休息时间
...全文
736 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
--小F-- 2012-08-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
CREATE TABLE tsf(start_time DATE,finish_time DATE);

INSERT INTO Tsf VALUES
(To_Date('2012-07-12 08:30:00', 'yyyy-mm-dd hh24:mi:ss'),
To_Date('2012-07-12 21:00:00', 'yyyy-mm-dd hh24:mi:ss'));
……
[/Quote]
还是ORACLE的。
筱筱澄 2012-08-14
  • 打赏
  • 举报
回复
主要就是写一堆 case when 判断 不想写


另外差值可以 这么计算
DATEDIFF(mi, CONVERT(VARCHAR(5),[START_TIME],114) ,'11:30')
  • 打赏
  • 举报
回复
要考虑的情况有15种,我把数据准备好了,楼上的好像少考虑了某些情况
if object_id('Test') is not null drop table Test
go
create table Test(START_TIME datetime,FINISH_TIME datetime)
go
insert into Test
select '2012-07-13 08:01:00.000', '2012-07-13 08:33:00.000' union all
select '2012-07-14 08:01:00.000', '2012-07-14 12:00:00.000' union all
select '2012-07-19 08:21:00.000', '2012-07-19 16:30:00.000' union all
select '2012-07-15 08:01:00.000', '2012-07-15 17:50:00.000' union all
select '2012-07-12 08:30:00.000', '2012-07-12 21:00:00.000' union all
select '2012-07-20 12:00:00.000', '2012-07-20 12:30:00.000' union all
select '2012-07-21 12:00:00.000', '2012-07-21 15:30:00.000' union all
select '2012-07-22 12:00:00.000', '2012-07-22 17:50:00.000' union all
select '2012-07-23 12:00:00.000', '2012-07-23 19:00:00.000' union all
select '2012-07-24 13:00:00.000', '2012-07-24 16:00:00.000' union all
select '2012-07-25 13:00:00.000', '2012-07-25 17:50:00.000' union all
select '2012-07-26 13:00:00.000', '2012-07-26 19:00:00.000' union all
select '2012-07-27 17:50:00.000', '2012-07-27 17:55:00.000' union all
select '2012-07-28 17:50:00.000', '2012-07-28 19:40:00.000' union all
select '2012-07-29 19:00:00.000', '2012-07-29 20:00:00.000'
go
ORAClE SE 2012-08-14
  • 打赏
  • 举报
回复
CREATE TABLE tsf(start_time DATE,finish_time DATE);

INSERT INTO Tsf VALUES
(To_Date('2012-07-12 08:30:00', 'yyyy-mm-dd hh24:mi:ss'),
To_Date('2012-07-12 21:00:00', 'yyyy-mm-dd hh24:mi:ss'));

INSERT INTO Tsf VALUES
(To_Date('2012-07-13 08:01:00', 'yyyy-mm-dd hh24:mi:ss'),
To_Date('2012-07-13 08:33:00', 'yyyy-mm-dd hh24:mi:ss'));

INSERT INTO Tsf VALUES
(To_Date('2012-07-16 08:30:00', 'yyyy-mm-dd hh24:mi:ss'),
To_Date('2012-07-16 08:52:00', 'yyyy-mm-dd hh24:mi:ss'));

INSERT INTO Tsf VALUES
(To_Date('2012-07-17 08:21:00', 'yyyy-mm-dd hh24:mi:ss'),
To_Date('2012-07-17 21:30:00', 'yyyy-mm-dd hh24:mi:ss'));

INSERT INTO Tsf VALUES
(To_Date('2012-07-18 08:30:00', 'yyyy-mm-dd hh24:mi:ss'),
To_Date('2012-07-18 21:30:00', 'yyyy-mm-dd hh24:mi:ss'));

COMMIT;


SELECT a.Start_Time,
a.Finish_Time,
CASE
WHEN To_Char(a.Finish_Time, 'HH24:mi:ss') > '18:00:00' THEN
(a.Finish_Time - a.Start_Time) * 24 - 1 - 0.5
WHEN (To_Char(a.Finish_Time, 'HH24:mi:ss') > '17:30:00' AND
To_Char(a.Finish_Time, 'HH24:mi:ss') < '18:00:00') THEN
((To_Date('17:30:00', 'hh24:mi:ss') -
To_Date(To_Char(a.Finish_Time, 'HH24:mi:ss'), 'hh24:mi:ss')) * 24 - 1)

WHEN To_Char(a.Finish_Time, 'HH24:mi:ss') < '17:30:00' AND
To_Char(a.Finish_Time, 'HH24:mi:ss') > '12:30:00' THEN
(a.Finish_Time - a.Start_Time) * 24 - 1

WHEN (To_Char(a.Finish_Time, 'HH24:mi:ss') < '12:30:00' AND
To_Char(a.Finish_Time, 'HH24:mi:ss') > '11:30:00') THEN
((To_Date('11:30:00', 'hh24:mi:ss') -
To_Date(To_Char(a.Finish_Time, 'HH24:mi:ss'), 'hh24:mi:ss')) * 24)

WHEN To_Char(a.Finish_Time, 'HH24:mi:ss') < '11:30:00' THEN
(a.Finish_Time - a.Start_Time) * 24
END "上班时间(小时)"
FROM Tsf a
ORAClE SE 2012-08-14
  • 打赏
  • 举报
回复
CREATE TABLE tsf(start_time DATE,finish_time DATE);

INSERT INTO Tsf VALUES
(To_Date('2012-07-12 08:30:00', 'yyyy-mm-dd hh24:mi:ss'),
To_Date('2012-07-12 21:00:00', 'yyyy-mm-dd hh24:mi:ss'));

INSERT INTO Tsf VALUES
(To_Date('2012-07-13 08:01:00', 'yyyy-mm-dd hh24:mi:ss'),
To_Date('2012-07-13 08:33:00', 'yyyy-mm-dd hh24:mi:ss'));

INSERT INTO Tsf VALUES
(To_Date('2012-07-16 08:30:00', 'yyyy-mm-dd hh24:mi:ss'),
To_Date('2012-07-16 08:52:00', 'yyyy-mm-dd hh24:mi:ss'));

INSERT INTO Tsf VALUES
(To_Date('2012-07-17 08:21:00', 'yyyy-mm-dd hh24:mi:ss'),
To_Date('2012-07-17 21:30:00', 'yyyy-mm-dd hh24:mi:ss'));

INSERT INTO Tsf VALUES
(To_Date('2012-07-18 08:30:00', 'yyyy-mm-dd hh24:mi:ss'),
To_Date('2012-07-18 21:30:00', 'yyyy-mm-dd hh24:mi:ss'));

COMMIT;


SELECT a.Start_Time,
a.Finish_Time,
CASE
WHEN To_Char(a.Finish_Time, 'HH24:mi:ss') > '18:00:00' THEN
(a.Finish_Time - a.Start_Time) * 24 - 1 - 0.5
WHEN (To_Char(a.Finish_Time, 'HH24:mi:ss') > '17:30:00' AND
To_Char(a.Finish_Time, 'HH24:mi:ss') < '18:00:00') THEN
((To_Date('17:30:00', 'hh24:mi:ss') -
To_Date(To_Char(a.Finish_Time, 'HH24:mi:ss'), 'hh24:mi:ss')) * 24 - 1)

WHEN To_Char(a.Finish_Time, 'HH24:mi:ss') < '17:30:00' AND
To_Char(a.Finish_Time, 'HH24:mi:ss') > '12:30:00' THEN
(a.Finish_Time - a.Start_Time) * 24 - 1

WHEN (To_Char(a.Finish_Time, 'HH24:mi:ss') < '12:30:00' AND
To_Char(a.Finish_Time, 'HH24:mi:ss') > '11:30:00') THEN
((To_Date('11:30:00', 'hh24:mi:ss') -
To_Date(To_Char(a.Finish_Time, 'HH24:mi:ss'), 'hh24:mi:ss')) * 24)

WHEN To_Char(a.Finish_Time, 'HH24:mi:ss') < '11:30:00' THEN
(a.Finish_Time - a.Start_Time) * 24
END "上班时间(小时)"
FROM Tsf a
ws_hgo 2012-08-14
  • 打赏
  • 举报
回复
LZ 很懒啊!这个问题不难,就是有点麻烦。体力活,自己解决吧!
烟灰洒落键盘 2012-08-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

稍微分析了下,要考虑情况多达十五左右,不太容易写
[/Quote]
这年头人懒了,就是不想写这么多if,看看有没现成的
zhulihui133 2012-08-14
  • 打赏
  • 举报
回复
没看明白楼主的意思,你的意思是算下一天到底有多少时间在上班吗 那你就以天数为分组原则,然后用finish_time减去start_time,在减去休息时间 这也就ok了啊
  • 打赏
  • 举报
回复
稍微分析了下,要考虑情况多达十五左右,不太容易写
ORAClE SE 2012-08-14
  • 打赏
  • 举报
回复
楼主,你是忽略六楼的答案么?
烟灰洒落键盘 2012-08-14
  • 打赏
  • 举报
回复
还是得自己写,想偷懒都不行

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧