2011-08-30 64 views
0

嘿傢伙,我試圖幫助我的朋友設計數據庫表。這是一個通過讀取某些讀卡器的卡信息來跟蹤工廠工作時間的系統。每次工作人員記錄他的進出信息時,都會保存一條記錄。如何設計工作時間的數據庫表?

我的問題是,我怎麼能計算出每個工人的工作時間(以分鐘爲單位),每個工作日?工作人員可以在上午8:00至20:00或下午20:00〜8:00AM工作。

任何人都可以幫到我嗎?

謝謝!


你們確實給了我很多幫助。 以前的設計是一張有記錄或無記錄的表格。我很難找到哪些屬於同一個工作時間跨度。我現在使用另一張帶有記錄的表格,它們在同一個記錄中都有時間和空閒時間。插入以節省時間,更新以節省停工時間,這使得計算準時和停工時間之間的總分鐘變得容易。

+0

您正在使用哪個版本的SQL Server? –

+0

SQL Server 2005 – Soony

+0

如果午夜在當前工作會話之間,該怎麼辦?整個工作時間都在計算工人開始工作的那一天或他結束工作的那一天,還是你必須在午夜之前分工? –

回答

3
SELECT datediff(hh,'2011-08-30 04:47','2011-08-30 05:48') as [Hour(s) Worked] 
Hour(s) Worked 
-------------- 
1 
+0

datediff(mi,...)會計算分鐘 –

+0

'DATEDIFF(hh,...)'會給你奇怪的結果。請閱讀我的答案。 –

2

有2個表

[TblUsers] 
User_id  PK 
FirstName 
LastName 

[TblSchedule] 
Schedule_id PK 
User_id  FK 
Date_From 
Date_To 

一個簡單的例子來獲得與次日常工作網格,你可以寫這樣的:

SELECT 
    u.FirstName + ' ' + u.LastName as [username], 
    CAST(FLOOR(CAST(@datetime as float)) as datetime) as [date], 
    DATEDIFF(minute, s.Date_To, s.Date_From) as [workMinutes] 
FROM 
    [TblSchedule] s, [TblUsers] u 
WHERE 
s.user_id = u.user_id 
GROUP BY 
    u.FirstName + ' ' + u.LastName, 
    CAST(FLOOR(CAST(@datetime as float)) as datetime) 
ORDER BY 
s.Date_From; 
+0

我只是不能用表名,對不起。請考慮'User'(或'SystemUser'以避免關鍵字衝突)和'Schedule'而不是使用前綴。 – Yuck

+0

他有一個帶有「IN-Record」和「OUT-Records」的表格。此外,我確信它必須爲每天的多次入住和退房做好準備,即工作人員正在退房吃午飯,之後再次入住。 –

1

只需計算出每個IN-Record及以下OUT-Record之間的分鐘數來自這名工人。如果你想要一整天,然後獲取相關記錄並總結相關的差異。

更復雜這裏的事情是當一些工人忘記衝壓。你的計劃必須爲這種情況做好準備。

也要注意夏令時等。時間計算器可能非常複雜。

我想我會做的應用水平計算,而不是在SQL在這種情況下。

0

DATEDIFF可以給你一些奇怪的結果。 例如採取這種兩DATETIME2(我相信你有SQL Server 2008中)有5分鐘的差值:

SELECT DATEDIFF(hh,'2011-01-01 04:59:00','2011-01-01 05:04:00') 
Results 
----------- 
1 

結果是莫名其妙奇怪:1小時。奇怪,因爲分鐘的差異是5分鐘,但是小時的差別是1小時,我們知道1小時= 60分鐘。請閱讀此article以查看解釋。

解決方案:

1)代替DATEDIFF(hh,...)使用DATEDIFF(mi,...) 例:

SELECT DATEDIFF(mi,'2011-01-01 07:55:00','2011-01-01 16:02:00') [Minutes] 
    ,DATEDIFF(mi,'2011-01-01 07:55:00','2011-01-01 16:02:00')/60 [Hours] 
    --8 hours 
    ,DATEDIFF(mi,'2011-01-01 07:55:00','2011-01-01 16:02:00')%60 [Additional minute] 
    --7 minute 

但:

SELECT DATEDIFF(mi,'2011-01-01 08:00:59','2011-01-01 16:00:05') [Minutes] 
     --480 
     ,DATEDIFF(ss,'2011-01-01 08:00:59','2011-01-01 16:00:05')/60 [Seconds/60] 
     --479 

2)而不是使用DATEDIFF功能(帶DATETIME[2][OFFSET]數據類型)的使用 - 運營商的DATETIME值:

DECLARE @Test TABLE 
(
    TestId INT IDENTITY(1,1) PRIMARY KEY 
    ,[Enter] DATETIME NOT NULL 
    ,[Exit] DATETIME NOT NULL 
); 
INSERT @Test 
VALUES ('2011-01-01 07:55:00','2011-01-01 16:02:02') 
     ,('2011-01-01 08:00:59','2011-01-01 16:00:05'); 

SELECT * 
     ,t.[Exit] - t.[Enter] AS MyDateDiff 
     ,DATEPART(hh,t.[Exit] - t.[Enter]) [Hours] 
     ,DATEPART(mi,t.[Exit] - t.[Enter]) [Additional minutes] 
     ,DATEPART(ss,t.[Exit] - t.[Enter]) [Additional seconds] 
FROM @Test t 

結果:

TestId  Enter     Exit     MyDateDiff    Hours  Additional minute Additional seconds 
----------- ----------------------- ----------------------- ----------------------- ----------- ----------------- ------------------ 
1   2011-01-01 07:55:00.000 2011-01-01 16:02:02.000 1900-01-01 08:07:02.000 8   7     2 
2   2011-01-01 08:00:59.000 2011-01-01 16:00:05.000 1900-01-01 07:59:06.000 7   59    6