SqlServer 日期的行转列

思路:

网上查到的行转列都是用聚合函数,像成绩这种。因此我把日期转成日期时间戳,再进行行转列。

/*将时间转换成时间戳*/
(cast((DATEDIFF(S,'1970-01-01 08:00:00', 要转换的时间) - 8 * 3600) AS bigint)) as sjc
/*再根据时间判断 上午和下午*/
(CASE WHEN (datepart(hour,要转换的时间)>=0 and datepart(hour, 要转换的时间)<12) THEN '上午' ELSE '下午' END) as sxw
/*将时间戳转成时间,因为最后我需要的是时分秒所以使用CONVERT再进行转换*/
CONVERT(VARCHAR(50),DATEADD(S,时间戳,'1970-01-01 08:00:00'),108) as qd_sj


最后附上整个sql语句和图片

	WITH	
	kq as (select samt.doc_creator_id ,samt.fd_id ,(case when samt.fd_status = 0 then '缺卡' 
	 when samt.fd_status = 1 then '正常'
     when samt.fd_status= 2 then '迟到'
     when samt.fd_status= 3 then '早退'
     when samt.fd_status= 4 then '出差'
     when samt.fd_status= 5 then '请假' 
      end) as status,fd_status ,doc_create_time ,(case when (datepart(hour,doc_create_time)>=0 and datepart(hour, doc_create_time)<12) THEN '签到状态' ELSE '签退状态' END) as zhuangtai,soe2.fd_name as jigou,soe3.fd_name as bumen,soe.fd_name as name,CONVERT(varchar(100), doc_create_time, 23) dktime,samt.fd_location as xdaddress, 
	(cast((DATEDIFF(S,'1970-01-01 08:00:00', doc_create_time)) AS bigint)) as sjc,(CASE WHEN (datepart(hour,doc_create_time)>=0 and datepart(hour, doc_create_time)<12) THEN '上午' WHEN (datepart(hour,doc_create_time)<=24 and datepart(hour, doc_create_time)>12) then '下午' else null END) as sxw
			from sys_attend_main_two samt join sys_org_element soe on samt.doc_creator_id  = soe.fd_id
			join sys_org_element soe2 on soe2.fd_id = soe.fd_parentorgid join sys_org_element soe3 on soe3.fd_id=soe.fd_parentid)
	select samt.*,row_number () over(order by dktime asc) pageNumber 
	from (select k2.dktime,k2.jigou,k2.name,k2.bumen,(case when qdzt = 0 then '缺卡'
	 when qdzt = 1 then '正常'
     when qdzt = 2 then '迟到'
     when qdzt = 3 then '早退'
     when qdzt = 4 then '出差'
     when qdzt = 5 then '请假' end) qd_zt,(case when qtzt = 0 then '缺卡'
	 when qtzt = 1 then '正常'
     when qtzt = 2 then '迟到'
     when qtzt = 3 then '早退'
     when qtzt = 4 then '出差'
     when qtzt = 5 then '请假'end) qt_zt,CONVERT(VARCHAR(50),DATEADD(S,qdsj,'1970-01-01 08:00:00'),108) as qd_sj,
    CONVERT(VARCHAR(50),DATEADD(S,qtsj,'1970-01-01 08:00:00'),108) as qt_sj
     from (
			(select dktime,jigou,name,bumen,max(签到状态)as qdzt,max(签退状态) as qtzt  from kq 
			pivot(sum(fd_status) for zhuangtai IN(签到状态,签退状态)) x
			group by dktime,name,bumen,jigou ) k2
			left JOIN 
			(select dktime,jigou,name,bumen,max(case when sxw='上午' then sjc end) as qdsj,
     				max(case  when sxw='下午' then sjc end) qtsj from kq group by dktime,jigou,name,bumen) k1 on k2.dktime=k1.dktime and k2.name=k1.name
		     
			)) samt

 

 dktime:签到的日期时间 jigou:机构 name:姓名 bumen:部门 qd_zt:签到状态 qt_zt:签退状态后面签到时间和签退时间还有分页生成的列 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值