利用SQL统计时间时怎么去除周末的时间(非工作日时间),我需要的是工作时间.
2007-03-13 16:09
447 查看
将所有周六/周日/节假日放入表二中.
if object_id('pubs..tb') is not null
drop table tb
go
create table tb(
Dept_ID varchar(10),
EmpNo varchar(10),
Start datetime,
tEnd datetime)
insert into tb(Dept_ID,EmpNo,Start,tEnd) values('A1000','C0701006','2006-10-10','2006-11-01')
insert into tb(Dept_ID,EmpNo,Start,tEnd) values('B2000','C0607003','2006-12-13','2006-12-29')
insert into tb(Dept_ID,EmpNo,Start,tEnd) values('C3000','C0501007','2007-02-02','2007-03-01')
go
if object_id('pubs..tb2') is not null
drop table tb2
go
create table tb2(
DateOfThis datetime,
EventType_FK int,
WorkingDay_Flag int)
insert into tb2(DateOfThis,EventType_FK,WorkingDay_Flag) values('2006-10-10', 85, 1)
insert into tb2(DateOfThis,EventType_FK,WorkingDay_Flag) values('2006-10-11', 85, 1)
insert into tb2(DateOfThis,EventType_FK,WorkingDay_Flag) values('2006-10-12', 85, 1)
insert into tb2(DateOfThis,EventType_FK,WorkingDay_Flag) values('2006-10-13', 85, 1)
insert into tb2(DateOfThis,EventType_FK,WorkingDay_Flag) values('2006-10-14', 82, 0)
insert into tb2(DateOfThis,EventType_FK,WorkingDay_Flag) values('2006-10-15', 82, 0)
insert into tb2(DateOfThis,EventType_FK,WorkingDay_Flag) values('2006-10-16', 85, 1)
insert into tb2(DateOfThis,EventType_FK,WorkingDay_Flag) values('2006-10-17', 85, 1)
insert into tb2(DateOfThis,EventType_FK,WorkingDay_Flag) values('2006-10-18', 85, 1)
insert into tb2(DateOfThis,EventType_FK,WorkingDay_Flag) values('2006-10-19', 85, 1)
insert into tb2(DateOfThis,EventType_FK,WorkingDay_Flag) values('2006-10-20', 85, 1)
insert into tb2(DateOfThis,EventType_FK,WorkingDay_Flag) values('2006-10-21', 82, 0)
insert into tb2(DateOfThis,EventType_FK,WorkingDay_Flag) values('2006-10-22', 82, 0)
go
select t1.* , datediff(day,t1.Start,t1.tEnd) - t2.days as days from tb t1,
(
select a.dept_id ,
sum(case when b.DateOfThis >= a.Start and b.DateOfThis <= a.tEnd and b.WorkingDay_Flag = 0 then 1 else 0 end) as days
from tb a , tb2 b
group by a.dept_id
) t2
where t1.dept_id = t2.dept_id
--datediff(day,Start,tEnd) as days from tb
drop table tb,tb2
/*
Dept_ID EmpNo Start tEnd days
---------- ---------- ------------------------------------------------------ ------------------------------------------------------ -----------
A1000 C0701006 2006-10-10 00:00:00.000 2006-11-01 00:00:00.000 18
B2000 C0607003 2006-12-13 00:00:00.000 2006-12-29 00:00:00.000 16
C3000 C0501007 2007-02-02 00:00:00.000 2007-03-01 00:00:00.000 27
(所影响的行数为 3 行)
*/
if object_id('pubs..tb') is not null
drop table tb
go
create table tb(
Dept_ID varchar(10),
EmpNo varchar(10),
Start datetime,
tEnd datetime)
insert into tb(Dept_ID,EmpNo,Start,tEnd) values('A1000','C0701006','2006-10-10','2006-11-01')
insert into tb(Dept_ID,EmpNo,Start,tEnd) values('B2000','C0607003','2006-12-13','2006-12-29')
insert into tb(Dept_ID,EmpNo,Start,tEnd) values('C3000','C0501007','2007-02-02','2007-03-01')
go
if object_id('pubs..tb2') is not null
drop table tb2
go
create table tb2(
DateOfThis datetime,
EventType_FK int,
WorkingDay_Flag int)
insert into tb2(DateOfThis,EventType_FK,WorkingDay_Flag) values('2006-10-10', 85, 1)
insert into tb2(DateOfThis,EventType_FK,WorkingDay_Flag) values('2006-10-11', 85, 1)
insert into tb2(DateOfThis,EventType_FK,WorkingDay_Flag) values('2006-10-12', 85, 1)
insert into tb2(DateOfThis,EventType_FK,WorkingDay_Flag) values('2006-10-13', 85, 1)
insert into tb2(DateOfThis,EventType_FK,WorkingDay_Flag) values('2006-10-14', 82, 0)
insert into tb2(DateOfThis,EventType_FK,WorkingDay_Flag) values('2006-10-15', 82, 0)
insert into tb2(DateOfThis,EventType_FK,WorkingDay_Flag) values('2006-10-16', 85, 1)
insert into tb2(DateOfThis,EventType_FK,WorkingDay_Flag) values('2006-10-17', 85, 1)
insert into tb2(DateOfThis,EventType_FK,WorkingDay_Flag) values('2006-10-18', 85, 1)
insert into tb2(DateOfThis,EventType_FK,WorkingDay_Flag) values('2006-10-19', 85, 1)
insert into tb2(DateOfThis,EventType_FK,WorkingDay_Flag) values('2006-10-20', 85, 1)
insert into tb2(DateOfThis,EventType_FK,WorkingDay_Flag) values('2006-10-21', 82, 0)
insert into tb2(DateOfThis,EventType_FK,WorkingDay_Flag) values('2006-10-22', 82, 0)
go
select t1.* , datediff(day,t1.Start,t1.tEnd) - t2.days as days from tb t1,
(
select a.dept_id ,
sum(case when b.DateOfThis >= a.Start and b.DateOfThis <= a.tEnd and b.WorkingDay_Flag = 0 then 1 else 0 end) as days
from tb a , tb2 b
group by a.dept_id
) t2
where t1.dept_id = t2.dept_id
--datediff(day,Start,tEnd) as days from tb
drop table tb,tb2
/*
Dept_ID EmpNo Start tEnd days
---------- ---------- ------------------------------------------------------ ------------------------------------------------------ -----------
A1000 C0701006 2006-10-10 00:00:00.000 2006-11-01 00:00:00.000 18
B2000 C0607003 2006-12-13 00:00:00.000 2006-12-29 00:00:00.000 16
C3000 C0501007 2007-02-02 00:00:00.000 2007-03-01 00:00:00.000 27
(所影响的行数为 3 行)
*/
相关文章推荐
- sql 查出两个时间段内所有的工作日时间[去除周六周日]
- C#获取两个时间的时间差并去除周末(取工作日)的方法
- java利用mybatis拦截器统计sql执行时间示例
- SQL 取时间差 去掉周末及非工作时间节假日
- oracle 中--怎么查看当前表空间在作什么操作?--查锁,死锁,当前执行时间长的Sql语句,没提交的事务,对象为哪些进程所用
- 统计MySQL中每条sql的执行时间
- 已知开始工作时间和工作日期计算工作日结束时间
- 利用大数据玩转移动统计分析市场的方式不止一种,看看TalkingData是怎么做的?
- SQL查询时间去除非工作日...
- 你是怎么利用时间的? 推荐
- 统计MySQL中每条sql的执行时间
- SQL 按时间统计语句
- ACCESS JET SQL 分段或者交叉统计的查询语句怎么写?
- asp sql语句中怎么比对两个时间
- sql查询技巧,按时间分段进行分组,每半小时一组统计组内记录数量
- oracle sql 按时间统计(天、周、月、季、年)
- 单身职场人士怎么利用晚上时间提高自己?
- sql数据统计——按时间统计
- SQL-利用默认自动记录时间
- SQL语法计算 统计时间日期