2011-09-23 428 views
0

他們有一個asp.net(vb)web應用程序來存儲加班(OT)記錄。如何檢索SQL Server中最近幾個小時的記錄

在SQL Server中,OT表喜歡這個,例如:

ot_key | From Time  | To Time   | total_min 
12  | 2011-09-22 10:00 | 2011-09-22 13:00 | 180 
13  | 2011-09-24 14:00 | 2011-09-24 15:00 | 60 
14  | 2011-09-23 12:00 | 2011-09-23 14:30 | 150 
15  | 2011-09-24 18:00 | 2011-09-24 19:30 | 90 

隨着用戶輸入一個日期OT記錄,所以在數據庫中的記錄將不會在序列。記錄#14的日期在記錄#13之前。

如果用戶想知道哪些OT記錄覆蓋近2個小時,該系統應檢索記錄#15(90分鐘)& #13(30分鐘),因爲他們在最後覆蓋了2小時。

如何編寫SQL語句來檢索記錄?由於

+2

您的數據看起來很奇怪:對#13 TOTIME是FROMTIME前一天。請檢查。 – Louis

+1

你想要什麼?只需選擇total_min低於兩小時的記錄? – Louis

+0

遵循TDD的口頭禪,一個簡單的'SELECT * FROM OTTable WHERE total_min <= 120'。 –

回答

1

,如果我理解正確的,所有你需要做的是(但其怪異的措辭你你的問題的方式,所以我不知道你在找這個東西。

select * from OT where total_min <= 
[number of hours expressed in minutes] 
+0

這只是獲得時間差小於2小時的條目,而不是過去2小時發佈的條目。 – Nicolai

+0

@Nicolai,真的,但OP要記錄15和13返回。記錄13在15:00結束,19:30記錄15。 *過去兩個小時*永遠不會退回。 OP給出的要求是錯誤的或至少是不完整的。 –

+0

你是對的,現在我很困惑。 – Nicolai

0

做一個

select * from OT where datediff(hour,ToTime,getdate()) < 2 

,這將給你的職位地方CURRENTTIME和TOTIME之間的差值小於2小時。

+0

這很可能是OP OP *預期*,但它不會返回記錄13和15. –

+0

對不起,你們所有人都感到困惑。我修改了我的問題,希望它會更好。 –

1
CREATE TABLE OT (
    [ot_key] INT, 
    [From Time] DATETIME, 
    [To Time] DATETIME, 
    [total_min] INT 
) 

INSERT OT 
VALUES (12,'2011-09-22 10:00', '2011-09-22 13:00', 180), 
     (13, '2011-09-24 14:00', '2011-09-24 15:00', 60), 
     (14, '2011-09-23 12:00', '2011-09-23 14:30', 150), 
     (15, '2011-09-24 18:00', '2011-09-24 19:30', 90) 

查詢:

DECLARE @CoverTime INT = 120 

;WITH cteOTRN AS (
    SELECT ROW_NUMBER() OVER (ORDER BY [To Time] DESC) AS [ROW_NUMBER], * 
    FROM OT 
) 
, cteOTRT AS (
    SELECT * 
    FROM cteOTRN ot 
    CROSS APPLY (
     SELECT SUM([total_min]) AS [RunningTotal] 
     FROM cteOTRN 
     WHERE [ROW_NUMBER] <= ot.[ROW_NUMBER] 
    ) rt 
) 
SELECT *, [total_min] AS [CoverTime] 
FROM cteOTRT ot 
WHERE [RunningTotal] <= @CoverTime 
UNION 
SELECT TOP 1 *, [RunningTotal] - @CoverTime 
FROM cteOTRT ot 
WHERE NOT ([RunningTotal] <= @CoverTime) 
AND NOT EXISTS (
    SELECT * 
    FROM cteOTRT ot 
    WHERE [RunningTotal] = @CoverTime 
) 
ORDER BY [To Time] DESC 

參見Calculate a Running Total in SQL Server