日期:2014-05-18  浏览次数:20508 次

字符串格式表示的时间转换为时间格式,高手给点思路
数据库表中存的时间类型为char(如10:11:11),为了实现这一列时间相加(求总时间),该怎样办,高手给个思路

------解决方案--------------------
declare @s nvarchar(20)
set @s= '10:11:11 '
select convert(datetime, @s, 114)
------解决方案--------------------
相加?
10:11:11
11:12:12
……
结果
21:23:23
建议存的时候全部转换成秒。这样统计会方便很多。如果该不了存储方式,那就全部计算成秒在统计,展示的时候换成时分秒
------解决方案--------------------
declare @s1 varchar(20),@s2 varchar(20)
select @s1= '2:11:21 ',set @s2= '10:11:11 '
select convert(varchar,convert(datetime, @s, 114)+convert(datetime, @s1, 114),108)
------解决方案--------------------
先不要转,时分秒各自相加,最后再用程序转换
------解决方案--------------------
做过类似的管理系统.
提供我的思路给你参考一下喇...
考勤记录表t_grkq
CREATE TABLE [dbo].[t_grkq] (
[mem_id] [int] NOT NULL , --员工id
[adate] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL , --日期
[type] [char] (1) COLLATE Chinese_PRC_CI_AI NULL , --考勤类型:上班或是休息
[a1] [char] (8) COLLATE Chinese_PRC_CI_AI NULL , --上午上班时间
[a2] [char] (8) COLLATE Chinese_PRC_CI_AI NULL , --上班下班时间
[a3] [char] (8) COLLATE Chinese_PRC_CI_AI NULL , --下午上班时间
[a4] [char] (8) COLLATE Chinese_PRC_CI_AI NULL , --下午下班时间
[a5] [char] (8) COLLATE Chinese_PRC_CI_AI NULL , --晚上加班上班时间
[a6] [char] (8) COLLATE Chinese_PRC_CI_AI NULL , --晚上加班下班时间
[jb] [decimal](6, 2) NULL , --当天正常上班时间统计
[ot] [decimal](6, 2) NULL , --当天加班时间统计
[cdd] [smallint] NULL , --迟到次数统计
[ztd] [smallint] NULL , --早退次数统计
[cdt] [decimal](6, 2) NULL , --当天迟到时间统计
[ztt] [decimal](6, 2) NULL --当天早退时间统计
) ON [PRIMARY]
GO

在存储过程中统计当天的上班时间统计,加班时间统计,迟到时间统计等等

CREATE PROCEDURE ap_mrkq_total @adate char(10),@mem_id AS --@adate 统计日期 'yyyy-mm-dd ',@mem_id为员工id
jb=round((isnull(datediff(s,case when a1 < '07:35 ' then '07:30:00 ' else a1 end,case when a2> '12:00 ' then '12:00:00 ' else a2 end),0)
+isnull(datediff(s,case when a3 < '13:35 ' then '13:30:00 ' else a3 end,case when a4> '17:00 ' then '17:00:00 ' else a4 end),0)+0.0)/3600,2)
,ot=round((isnull(datediff(s, a5,a6),0)+0.0)/3600,2)
,cdd=isnull(case when a1> '07:35 ' then 1 else 0 end,0)+isnull(case when a3> '13:35 ' then 1 else 0 end,0)
,ztd=isnull(case when a2 < '11:55 ' then 1 else 0 end,0)+isnull(case when a4 < '16:55 ' then 1 else 0 end,0)
,cdt=round((isnull(case when a1> '07:35 ' then datediff(s, '07:30:00 ',a1) else 0 end,0)+isnull(case when a3> '13:35 ' then datediff(s, '13:30:00 ',a3) else 0 end,0)+0.0)/3600,2)
,ztt=round((isnull(case when a2 < '11:55 ' then datediff(s,a2, '12:00:00 ') else 0 end,0)+isnull(case when a4 < '16:55 ' then datediff(s,a4, '17:00:00 ') else 0 end,0)+0.0)/3600,2)
where adate = @date and mem_id = @mem_id
go

对上面的存储过程说明一下,上面的存储过程是按照上午7点半上班到12点,下午1点半到5点钟下班,迟到时间从上午的7点35分以及下午的1点35分开始算起,这样是考虑到有一段缓冲期,对于早退也是按照同样的道理.
统计里面主要是用了datediff函数来计算时间差距,然后把得到的结果付给相应的字段进行统计,这样基本上就解决对迟到时间的统计.统计全部以 "秒 "为单位,所以有了 "/3600 "

希望可以LZ有所帮助喇,数据表和存储过程都在上面了.