2012-10-10 22 views
2

我被要求確定員工從Microsoft Access中的數據庫中處理任務的時間。基本上,一個表格包含僱員ID,任務標識符(作業編號),狀態(開始工作1,結束工作2)以及事件的日期時間。如何查找數據庫中日期時間條目之間經過的時間

只有一個人可以在任何工作上工作,一旦開始工作,他們必須完成任務才能開始另一個工作。數據庫中的條目可能看起來像

EmpID   TaskID  TaskStatus  TaskDate 
1    A001   1    15/09/12 09:00 
2    A023   1    15/09/12 09:00 
1    A001   2    15/09/12 09:30 
3    A011   1    15/09/12 09:35 
3    A011   2    15/09/12 09:45 
1    A016   1    15/09/12 09:45 
2    A023   2    15/09/12 09:45 
.. 

我需要製作一份報告,顯示

EmpID   TaskID  Time Take 
1    A001   0:30 
2    A023   0:45 
3    A011   0:10 

而且這種話,我需要列出只有那些比一個給定的時間花了更少的任務(以用於確保快速完成工作的質量標準仍然滿足)。

感謝所有幫助。

+2

請學會使用Google(「SQL date」)。第一個結果是http://www.w3schools.com/sql/sql_dates.asp,閱讀關於日期函數(http://www.w3schools.com/sql/func_datediff.asp)datediff將是你感興趣的。 –

+0

每個員工的數據庫中是否有taskStartDatetime,taskEndDateTime? –

回答

0

嘗試這樣:

這是SQL服務器的語法,就需要將它轉換到MS Access,我認爲你需要隱蔽的唯一事情是投功能,將數字轉換爲字符串

select t1.EmpID, 
     t1.TaskID, 
     cast(datediff('n',t1.TaskDate,t2.TaskDate)/60 as varchar(10))+' : '+ 
     cast(datediff('n',t1.TaskDate,t2.TaskDate)%60 as char(2)) as TimeTaken 
from table1 t1 
inner join table1 t2 
on  t1.EmpID=t2.EmpID 
and t1.TaskID=t2.TaskID 
where t1.TaskStatus=1 
and t2.TaskStatus=2 


SQL fiddle demo

+0

當您嘗試僅使用「join」而未指定類型(內部,左側或右側)時,Access數據庫引擎就會引發語法錯誤。 – HansUp

+0

'DateDiff()'需要第一個參數(間隔)的字符串值。 – HansUp

+0

@HansUp:感謝您的意見..我糾正了它.. Cstr()被用於cast()? –

1

該查詢會給你在幾分鐘的持續時間爲每個TaskID。未完成的任務(不帶TaskStatus=2的行)將返回Null作爲持續時間。如果您希望排除未完成的任務,則可以使用INNER JOIN

SELECT 
    strt.EmpID, 
    strt.TaskID, 
    DateDiff('n',strt.TaskDate,stp.TaskDate) AS minutes_taken 
FROM 
    YourTable AS strt 
    LEFT JOIN (
      SELECT TaskID, TaskDate 
      FROM YourTable 
      WHERE TaskStatus=2 
     ) AS stp 
    ON strt.TaskID = stp.TaskID 
WHERE strt.TaskStatus=1; 

注意我只用TaskID的加盟條件,因爲「只有一個人可以在任何崗位工作,一旦開始,他們必須開始另一個之前完成任務。」如果我的解釋錯誤,請更改ON條款。

構建另一個基於該查詢的查詢來過濾minutes_taken上的結果。

PARAMETERS target Short; 
SELECT 
    sub.EmpID 
    sub.TaskID 
    sub.minutes_taken 
FROM 
    (
     SELECT 
      strt.EmpID, 
      strt.TaskID, 
      DateDiff('n',strt.TaskDate,stp.TaskDate) AS minutes_taken 
     FROM 
      YourTable AS strt 
      LEFT JOIN (
        SELECT TaskID, TaskDate 
        FROM YourTable 
        WHERE TaskStatus=2 
       ) AS stp 
      ON strt.TaskID = stp.TaskID 
     WHERE strt.TaskStatus=1 
    ) AS sub 
WHERE sub.minutes_taken < target; 
相關問題