日期:2014-05-17  浏览次数:20561 次

T-SQL統計時間間隔
現有MS SQL 的一個表Attendance(ADate,CardNo,OnDuty1,OffDuty1,OnDuty2,OffDuty2,OnDuty3,OffDuty3),ADate為時間類型。其餘均為Varchar數據類型,其中OnDuty1,為班次的上午上班的打卡時間,OffDuty1為班次的上午下班的打卡時間,OnDuty2、OffDuty2為班次的下午上班打卡時間、下午下班打卡時間,OnDuty3、OffDuty3為班次的晚上加班上班打卡時間、晚上加班下班打卡時間。。。。有如下數據記錄,想在要統計某個卡號在某天的上午上班工作時間WT1由(OffDuty1-onDuty1)所得,下班上班工作時間WT2由(OffDuty2-OnDuty2)所得,WT3晚上加班工作時間由(OffDuty3-OnDuty3)所得

ADate         CardNo         OnDuty1 OffDuty1 OnDuty2 OffDuty2    OnDuty3 OffDuty3  WT1 WT2 WT3
2011-03-27  123456789      07:15:00 13:10:00 17:05:00  20:00:00
2011-03-27  012456788      07:30:00 13:30:00 17:21:00
2011-03-27  223456789    12:02:00 13:10:00 17:05:00   17:58:00  
2011-03-27  112456788      07:30:00 13:30:00 17:21:00
2011-03-26  112356788      07:30:00 12:00:00 13:20:00 17:28:00
2011-03-25  122356788      07:05:00 12:12:00 13:22:00 17:25:00   17:45:00 22:36:00

現在要Update下,,分別計算出WT1=(OffDuty1-onDuty1),WT2=(OffDuty2-OnDuty2),WT3=(OffDuty3-OnDuty3)的工作時間,

T-SQL:
UPDATE ATTENDANCE SET WT1 =  CONVERT(VARCHAR, ISNULL(DATEDIFF(MI,ONDUTY1,OFFDUTY1),'')/60)+ 'H'+CONVERT(VARCHAR, ISNULL(DATEDIFF(MI,ONDUTY1,OFFDUTY1),'')%60)+'M',
         WT2 = CONVERT(VARCHAR, ISNULL(DATEDIFF(MI,ONDUTY2,OFFDUTY2),'')/60)+ 'H'+CONVERT(VARCHAR, ISNULL(DATEDIFF(MI,ONDUTY2,OFFDUTY2),'')%60)+'M',
         WT3 = CONVERT(VARCHAR, ISNULL(DATEDIFF(MI,ONDUTY3,OFFDUTY3),'')/60)+ 'H'+CONVERT(VARCHAR, ISNULL(DATEDIFF(MI,ONDUTY3,OFFDUTY3),'')%60)+'M'
  


顯示結果如下
/*
 WT1       WT2     WT3
-7H-15M   3H55M 20H0M
-7H-30M   3H51M 0H0M
*/
這個T—SQL問題在。若某個卡號在某天的班次沒打卡,計算出負工作時間數來,顯然不正確,,如某個班次沒打卡,則顯示WT為0或者NULL

請哪位達人幫忙看下

------解决方案--------------------
case when WT1<0 then 0 else WT1 end 

------解决方案--------------------
樓上的,。。。能具體點嗎,。
UPDATE Attendance SET ....
後面的CASE SQL 如何寫
   
------解决方案--------------------
沒人進來嗎。。。達人過來下,,這樣的T-SQL(Ver SQL 2000)如何寫
------解决方案--------------------
想知道DATEDIFF怎么用