我有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