我有View
在SQL
名称为vw_Rept_Attend
和列名在HH返回大于24小时:mm:ss格式在SQL Server 2008
UserID (int),WorkHrs (varchar),ExtraHrs varchar(), AtnDate (datetime), EmpName (varchar),
EmpType (varchar), UserName (varchar),Role (varchar)
上WorkHrs
实际工作和ExtraHrs
等什么我这样做是
我存储在WorkHrs
员工的每日工作时间和ExtraHrs
额外的小时,然后我显示出席总结通过过滤器提供的两个日期之间RY报告,
很明显,我做的最大的事情与你的专家建议,申请将小数据和客户端的测试工作正常,我得到了我没有在那个时候考虑的一个问题
问题描述
每一个员工都有工件9小时,每天(每天工作时间)
工作时间(登录时间)
加班(每天工作时间 - 工作时间)
如果员工工作6 hours
所以他额外的时间将是-3 hours
负的,因为少工作时间比需要的时间和我这个c#
声明
wrktime= workinghrs.Subtract(Convert.ToDateTime(time).TimeOfDay);
TimeSpan Daily_work = new TimeSpan(9, 0, 0);
TimeSpan exthrs = Convert.ToDateTime(wrktime).TimeOfDay.Subtract(Daily_work);
得到这个结果
,这会给我负当任何一个工作少于9 hours
因此,如果用户对300 days
每天-3 hours
添加到database
结果将是这样做为300 days
我阅读使用以下sqlprocedure
对水晶报表
ALTER PROCEDURE [dbo].[sp_Rpt_Emps_Attnd]
@strt date,
@end date
AS
begin
with cte
as
(select UserID,
WorkHrs,
case when left(ExtraHrs,1)='-' then -1 else 1 end as multiply,
right(ExtraHrs,8) as timestring,
--get hours in seconds:
DATEPART(HOUR,right(ExtraHrs,8)) * 3600 AS h_in_s,
--get minutes in seconds:
DATEPART(MINUTE,right(ExtraHrs,8)) * 60 AS m_in_s,
--get seconds:
DATEPART(SECOND,right(ExtraHrs,8)) AS s,AtnDate,EmpName,EmpType,
UserName, Role,StartDate,EndDate
from vw_Rept_Attend
)
select UserID,dbo.udfTimeSpanFromSeconds(Sum(Left(workhrs,2) * 3600 + substring(Convert(varchar(8),workhrs), 4,2) * 60 + substring(Convert(varchar(8),workhrs), 7,2))) as WorkHrs ,
case when sum((c.h_in_s + c.m_in_s + c.s) * multiply) < 0
then '-' + CONVERT(varchar,DATEADD(s,ABS(sum((c.h_in_s + c.m_in_s + c.s) * multiply)),0),114)
else CONVERT(varchar,DATEADD(s,sum((c.h_in_s + c.m_in_s + c.s) * multiply),0),114)
end as ExtraHrs ,EmpName,EmpType,UserName, Role,convert(VARCHAR(10),StartDate,105) as StartDate,convert(VARCHAR(10),EndDate,105) as EndDate
from cte c where convert(date,AtnDate) between @strt and @end
group by UserID,EmpName,EmpType,UserName, Role,StartDate,EndDate
Order by UserID
end
和功能显示的计算日期之间的所有WorkHrs
的总和作为
ALTER FUNCTION udfTimeSpanFromSeconds(
@sec INT
)
RETURNS VARCHAR(15)
AS
BEGIN
RETURN
CONVERT(VARCHAR(10), (@sec/3600)) + ':' +
RIGHT('0' + CONVERT(VARCHAR(2), ((@sec % 3600)/60)), 2) + ':' +
RIGHT('0' + CONVERT(VARCHAR(2), (@sec % 60)), 2)
END
我是从把所有这个纪录我stack
How to format time from dd:hh:mm:ss to only hh:mm:ss in SQL server?
但是th这是stored procedure
一部分我提到上面即
case when left(ExtraHrs,1)='-' then -1 else 1 end as multiply,
right(ExtraHrs,8) as timestring,
--get hours in seconds:
DATEPART(HOUR,right(ExtraHrs,8)) * 3600 AS h_in_s,
--get minutes in seconds:
DATEPART(MINUTE,right(ExtraHrs,8)) * 60 AS m_in_s,
--get seconds:
DATEPART(SECOND,right(ExtraHrs,8)) AS s
计算ExtHrs
总和电子部分只支持24 hours
例如,如果结果是27 hours
然后它显示3 hours
,如果它是-56 hours
然后它显示-8 hours
我使用SQL Server 2008
,
我认为足够的描述来理解,但如果你们中的任何人不明白,那么请免费要求我分享代码或我使用的任何逻辑。
您的帮助将不胜感激,
在此先感谢。
编辑:
这个问题What is the correct SQL type to store a .Net Timespan with values > 24:00:00?是完全不同的,因为我不是问哪个datatype
我应该使用
这里的应用程序可以获取负时间值,例如,-3小时,我说得很清楚,并timespan
数据类型不接受负号。
现在我觉得应该清除
更新 在我的数据库,它看起来像
这样计算后ExtHrs
应该是-31:50:46
但它显示-7:50:46
我认为这是因为不支持大于24 hours
你能抛出一些样本数据,比如只有Extrahr和workhr数据以及你期望的输出吗? – KumarHarsh
@KumarHarsh,请参阅我的编辑 – Waqas