有请gahade(与君共勉)大哥 进来帮忙

posaden 2007-04-25 09:26:14
在存储过程中生成个临时表 关于考勤统计的
按月份 如1月为31天 则有31个字段 样式如下
1 2 3 4 ……31
早班上 7:30 7:26 ……
早班下 11:30 11:50 ……
中班上 14:01 14:45 ……
中班下 ……
该如何做?
没头绪 介绍个简单的方法
...全文
259 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
gahade 2007-04-25
  • 打赏
  • 举报
回复
drop table tablelist
go
create table tablelist(日期 datetime,早班上班刷卡时间 datetime,早班下班刷卡时间 datetime,中班上班刷卡时间 datetime,中班下班刷卡时间 datetime)
insert into tablelist
select '2006-04-01','2006-04-01 7:21:00','2006-04-01 11:30:00','2006-04-01 13:59:00','2006-04-01 18:00:00'
union all select '2006-04-02','2006-04-02 7:30:00','2006-04-02 12:00:00','2006-04-02 14:01:00','2006-04-02 18:03:00'
union all select '2006-04-03','2006-04-03 7:14:00','2006-04-03 11:45:00','2006-04-03 13:56:00','2006-04-03 17:59:00'

declare @sql varchar(8000),@sql1 varchar(2000),@sql2 varchar(2000),@sql3 varchar(2000),@sql4 varchar(2000)
select @sql1='',@sql2='',@sql3='',@sql4=''
select @sql1=@sql1+',max(case when convert(varchar(10),早班上班刷卡时间,120) ='''+日期+''' then right(convert(varchar(19),早班上班刷卡时间,120),8) else ''-'' end) as '''+日期+''''
from (select distinct convert(char(10),日期,120) as 日期 from tablelist)tablelist

select @sql2=@sql2+',max(case when convert(varchar(10),早班下班刷卡时间,120) ='''+日期+''' then right(convert(varchar(19),早班下班刷卡时间,120),8) else ''-'' end)'
from (select distinct convert(char(10),日期,120) as 日期 from tablelist)tablelist

select @sql3=@sql3+',max(case when convert(varchar(10),中班上班刷卡时间,120) ='''+日期+''' then right(convert(varchar(19),中班上班刷卡时间,120),8) else ''-'' end)'
from (select distinct convert(char(10),日期,120) as 日期 from tablelist)tablelist

select @sql4=@sql4+',max(case when convert(varchar(10),中班下班刷卡时间,120) ='''+日期+''' then right(convert(varchar(19),中班下班刷卡时间,120),8) else ''-'' end)'
from (select distinct convert(char(10),日期,120) as 日期 from tablelist)tablelist

set @sql='select ''早班上班刷卡时间'' as type'+@sql1+' from tablelist'+char(13)+'union all'+char(13)+'select ''早班下班刷卡时间'''+@sql2+' from tablelist'+char(13)+'union all'+char(13)+'select ''中班上班刷卡时间'''+@sql3+' from tablelist'+char(13)+'union all'+char(13)+'select ''中班下班刷卡时间'''+@sql4+' from tablelist'
exec(@sql)

/*
type 2006-04-01 2006-04-02 2006-04-03
---------------- ---------------- ---------------- ----------------
早班上班刷卡时间 07:21:00 07:30:00 07:14:00
早班下班刷卡时间 11:30:00 12:00:00 11:45:00
中班上班刷卡时间 13:59:00 14:01:00 13:56:00
中班下班刷卡时间 18:00:00 18:03:00 17:59:00
*/
posaden 2007-04-25
  • 打赏
  • 举报
回复
如果刷卡时间不在该班次的上下限中 则刷卡时间为'-'
posaden 2007-04-25
  • 打赏
  • 举报
回复
生成每个月天数的列可以生成.
那你一天当中有多个上班方式,而每个上班方式中不一定有刷卡,且刷卡是否在该上班方式允许的上下限中,比较麻烦.
--------------------------------------------------
这些情况已经在tablelist里做过判断 如果没有刷卡记录 则刷卡时间的值为'-'
posaden 2007-04-25
  • 打赏
  • 举报
回复
数据由表tablelist取出
tablelist样式如下

日期 早班上班刷卡时间 早班下班刷卡时间 中班上班刷卡时间 ……
2006-04-01 7:21 11:30 13:59
2006-04-02 7:30 12:00 14:01
2006-04-03 7:14 11:45 13:56
……
要得到以下的样子
临时表 table_mx

1 2 3 4 ……31
早班上 7:21 7:30 ……
早班下 11:30 12:00 ……
中班上 13:59 14:01……
中班下 ……

gahade 2007-04-25
  • 打赏
  • 举报
回复
生成每个月天数的列可以生成.
那你一天当中有多个上班方式,而每个上班方式中不一定有刷卡,且刷卡是否在该上班方式允许的上下限中,比较麻烦.
posaden 2007-04-25
  • 打赏
  • 举报
回复
gahade(与君共勉)
--------------->
真的很谢谢……
揭贴了

做存储过程才一个星期,多亏你帮忙

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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