22,209
社区成员
发帖
与我相关
我的任务
分享
--增加建议,在最后一行
--修改文本缩进
--sql server 2012
--如果表存在,就删除它
if object_id('AtRecord','U') is not null drop table AtRecord
create table AtRecord ( nameid char(4),workdate date,worktime time(0),flag varchar(6))
go
--插入数值
insert into AtRecord(nameid,workdate,worktime,flag)
values('0002','2014-02-26','07:00:55','早班上')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0002','2014-02-26','07:50:36','-')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0002','2014-02-26','15:10:06','中班上')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0002','2014-02-26','15:53:04','-')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0002','2014-02-26','15:56:46','-')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0002','2014-02-26','16:16:57','早班下')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0002','2014-02-26','23:58:17','晚班上')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0002','2014-02-27','00:17:38','中班下')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0002','2014-02-27','07:58:21','晚班下')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0003','2014-02-27','15:19:56','中班上')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0003','2014-02-27','15:51:31','-')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0003','2014-02-27','23:40:19','晚班上')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0003','2014-02-28','00:20:42','中班下')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0003','2014-02-28','07:55:44','-')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0003','2014-02-28','08:11:43','晚班下')
--解决方案如下
;with workOn as
(
select nameid,workdate,min(worktime) as worktime,flag
from AtRecord
where substring(flag,3,1)='上'
group by nameid,workdate,flag
),
workOff as
(
select nameid,workdate,min(worktime) as worktime,flag
from AtRecord
where substring(flag,3,1)='下'
group by nameid,workdate,flag
)
select * ,datediff(hour,cast(a.workdate as varchar)+' '+cast(a.worktime as varchar),cast(b.workdate as varchar)+' '+cast(b.worktime as varchar)) as workhours
from workOn as a
inner join
WorkOff as b on a.nameid = b.nameid
and datediff(hour,a.workdate,b.workdate)<=24
and left(a.flag,2)=left(b.flag,2)
--结果展示
/*
nameid workdate worktime flag nameid workdate worktime flag workhours
------ ---------- ---------------- ------ ------ ---------- ---------------- ------ -----------
0002 2014-02-26 07:00:55 早班上 0002 2014-02-26 16:16:57 早班下 9
0002 2014-02-26 23:58:17 晚班上 0002 2014-02-27 07:58:21 晚班下 8
0002 2014-02-26 15:10:06 中班上 0002 2014-02-27 00:17:38 中班下 9
0003 2014-02-27 23:40:19 晚班上 0003 2014-02-28 08:11:43 晚班下 9
0003 2014-02-27 15:19:56 中班上 0003 2014-02-28 00:20:42 中班下 9
(5 行受影响)
*/
--月工作时长
;with workOn as
(
select nameid,workdate,min(worktime) as worktime,flag
from AtRecord
where substring(flag,3,1)='上'
group by nameid,workdate,flag
),
workOff as
(
select nameid,workdate,min(worktime) as worktime,flag
from AtRecord
where substring(flag,3,1)='下'
group by nameid,workdate,flag
)
select a.nameid ,sum(datediff(hour,cast(a.workdate as varchar)+' '+cast(a.worktime as varchar),cast(b.workdate as varchar)+' '+cast(b.worktime as varchar))) as workhours
from workOn as a
inner join
WorkOff as b on a.nameid = b.nameid
and datediff(hour,a.workdate,b.workdate)<=24
and left(a.flag,2)=left(b.flag,2)
group by a.nameid
--结果展示
/*
nameid workhours
------ -----------
0002 26
0003 18
(2 行受影响)
*/
--写在最后,1.5W人,一人一天之多上2班至少打4次卡,按每人一天打10次卡来算,一天15万数据,一月*30=450w数据,
--我的建议是where添加一个条件len(flag)=3 筛选出来的数据就是4*15000*30=180万数据,就好筛选多了。
--至于索引嘛,我感觉没什么好加的,你可以自己摸索
--修改文本缩进
--sql server 2012
--如果表存在,就删除它
if object_id('AtRecord','U') is not null drop table AtRecord
create table AtRecord ( nameid char(4),workdate date,worktime time(0),flag varchar(6))
go
--插入数值
insert into AtRecord(nameid,workdate,worktime,flag)
values('0002','2014-02-26','07:00:55','早班上')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0002','2014-02-26','07:50:36','-')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0002','2014-02-26','15:10:06','中班上')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0002','2014-02-26','15:53:04','-')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0002','2014-02-26','15:56:46','-')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0002','2014-02-26','16:16:57','早班下')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0002','2014-02-26','23:58:17','晚班上')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0002','2014-02-27','00:17:38','中班下')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0002','2014-02-27','07:58:21','晚班下')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0003','2014-02-27','15:19:56','中班上')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0003','2014-02-27','15:51:31','-')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0003','2014-02-27','23:40:19','晚班上')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0003','2014-02-28','00:20:42','中班下')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0003','2014-02-28','07:55:44','-')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0003','2014-02-28','08:11:43','晚班下')
--解决方案如下
;with workOn as
(
select nameid,workdate,min(worktime) as worktime,flag
from AtRecord
where substring(flag,3,1)='上'
group by nameid,workdate,flag
),
workOff as
(
select nameid,workdate,min(worktime) as worktime,flag
from AtRecord
where substring(flag,3,1)='下'
group by nameid,workdate,flag
)
select * ,datediff(hour,cast(a.workdate as varchar)+' '+cast(a.worktime as varchar),cast(b.workdate as varchar)+' '+cast(b.worktime as varchar)) as workhours
from workOn as a
inner join
WorkOff as b on a.nameid = b.nameid
and datediff(hour,a.workdate,b.workdate)<=24
and left(a.flag,2)=left(b.flag,2)
--结果展示
/*
nameid workdate worktime flag nameid workdate worktime flag workhours
------ ---------- ---------------- ------ ------ ---------- ---------------- ------ -----------
0002 2014-02-26 07:00:55 早班上 0002 2014-02-26 16:16:57 早班下 9
0002 2014-02-26 23:58:17 晚班上 0002 2014-02-27 07:58:21 晚班下 8
0002 2014-02-26 15:10:06 中班上 0002 2014-02-27 00:17:38 中班下 9
0003 2014-02-27 23:40:19 晚班上 0003 2014-02-28 08:11:43 晚班下 9
0003 2014-02-27 15:19:56 中班上 0003 2014-02-28 00:20:42 中班下 9
(5 行受影响)
*/
--月工作时长
;with workOn as
(
select nameid,workdate,min(worktime) as worktime,flag
from AtRecord
where substring(flag,3,1)='上'
group by nameid,workdate,flag
),
workOff as
(
select nameid,workdate,min(worktime) as worktime,flag
from AtRecord
where substring(flag,3,1)='下'
group by nameid,workdate,flag
)
select a.nameid ,sum(datediff(hour,cast(a.workdate as varchar)+' '+cast(a.worktime as varchar),cast(b.workdate as varchar)+' '+cast(b.worktime as varchar))) as workhours
from workOn as a
inner join
WorkOff as b on a.nameid = b.nameid
and datediff(hour,a.workdate,b.workdate)<=24
and left(a.flag,2)=left(b.flag,2)
group by a.nameid
--结果展示
/*
nameid workhours
------ -----------
0002 26
0003 18
(2 行受影响)
*/
--sql server 2012
--如果表存在,就删除它
if object_id('AtRecord','U') is not null drop table AtRecord
create table AtRecord ( nameid char(4),workdate date,worktime time(0),flag varchar(50))
go
--插入数值
insert into AtRecord(nameid,workdate,worktime,flag)
values('0002','2014-02-26','07:00:55','早班上')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0002','2014-02-26','07:50:36','-')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0002','2014-02-26','15:10:06','中班上')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0002','2014-02-26','15:53:04','-')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0002','2014-02-26','15:56:46','-')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0002','2014-02-26','16:16:57','早班下')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0002','2014-02-26','23:58:17','晚班上')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0002','2014-02-27','00:17:38','中班下')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0002','2014-02-27','07:58:21','晚班下')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0003','2014-02-27','15:19:56','中班上')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0003','2014-02-27','15:51:31','-')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0003','2014-02-27','23:40:19','晚班上')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0003','2014-02-28','00:20:42','中班下')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0003','2014-02-28','07:55:44','-')
insert into AtRecord(nameid,workdate,worktime,flag)
values('0003','2014-02-28','08:11:43','晚班下')
--解决方案如下
;with workOn as
(
select nameid,workdate,min(worktime) as worktime,flag from AtRecord where substring(flag,3,1)='上' group by nameid,workdate,flag
),
workOff as
(
select nameid,workdate,min(worktime) as worktime,flag from AtRecord where substring(flag,3,1)='下' group by nameid,workdate,flag
)
select * ,datediff(hour,cast(a.workdate as varchar)+' '+cast(a.worktime as varchar),cast(b.workdate as varchar)+' '+cast(b.worktime as varchar)) as workhours
from workOn as a inner join WorkOff as b on a.nameid = b.nameid and datediff(hour,a.workdate,b.workdate)<=24 and left(a.flag,2)=left(b.flag,2)
--结果展示
/*
nameid workdate worktime flag nameid workdate worktime flag workhours
------ ---------- ---------------- -------------------------------------------------- ------ ---------- ---------------- -------------------------------------------------- -----------
0002 2014-02-26 07:00:55.0000000 早班上 0002 2014-02-26 16:16:57.0000000 早班下 9
0002 2014-02-26 23:58:17.0000000 晚班上 0002 2014-02-27 07:58:21.0000000 晚班下 8
0002 2014-02-26 15:10:06.0000000 中班上 0002 2014-02-27 00:17:38.0000000 中班下 9
0003 2014-02-27 23:40:19.0000000 晚班上 0003 2014-02-28 08:11:43.0000000 晚班下 9
0003 2014-02-27 15:19:56.0000000 中班上 0003 2014-02-28 00:20:42.0000000 中班下 9
(5 行受影响)
*/
--月工作时长
;with workOn as
(
select nameid,workdate,min(worktime) as worktime,flag from AtRecord where substring(flag,3,1)='上' group by nameid,workdate,flag
),
workOff as
(
select nameid,workdate,min(worktime) as worktime,flag from AtRecord where substring(flag,3,1)='下' group by nameid,workdate,flag
)
select a.nameid ,sum(datediff(hour,cast(a.workdate as varchar)+' '+cast(a.worktime as varchar),cast(b.workdate as varchar)+' '+cast(b.worktime as varchar))) as workhours
from workOn as a inner join WorkOff as b on a.nameid = b.nameid and datediff(hour,a.workdate,b.workdate)<=24 and left(a.flag,2)=left(b.flag,2)
group by a.nameid
--结果展示
/*
nameid workhours
------ -----------
0002 26
0003 18
(2 行受影响)
*/