2012-04-25 47 views
1

我需要編寫一個函數,該函數在一列中調用StartTime,以顯示小時並將其插入另一個名爲StartHour的列中。在另一個名爲EndTime的列中,我還需要使用DATEPART累計到下一個增加的小時數(例如:23:33:00.00000000將是23(小時)+1(將其舍入到最後小時)= 24我需要將它保存到EndHour列中)。需要編寫SQL Server存儲過程以基於時間計算來保存一個或多個行

我要插入這些新的值到名爲StartHour和StartMinute,EndHour和EndMinute(於starttime和結束時間列的新列我在時間(7)格式和歷史的目的工作原始值,我將它們保留在原來的專欄中)。

這裏是我迄今爲止在T-SQL:

SELECT (DATEPART(HOUR, [StartTime])) AS StartHour,(DATEPART(MINUTE, [StartTime])) AS StartMinute, 
(DATEPART(HOUR, [EndTime])) AS EndHour, 
(DATEPART(MINUTE, [EndTime])) AS EndMinute, StartTime, EndTime 
    FROM [test].[dbo].[Outage_Reports] 
    ORDER BY OutageDate ASC 

主要生產:

StartHour StartMinute EndHour  EndMinute  Startime   EndTime 
16  0     17  30   16:00:00 17:30:00 

我現在需要寫這個轉換成一個存儲過程,也可以插入兩個(或如果中斷時間持續數小時,則更多)當開始和結束之間的長度超過一個小時時,將新行插入表中。或者當停電時間低於或等於一小時時插入一行。然後我需要在開始和結束專欄中說明每小時的進度。像這樣:

StartHour StartMinute EndHour  EndMinute  Startime  EndTime 
     16   0    17   00   16:00:00   17:30:00 

(以上反映停電的第一個小時,下面第二行反映停電的第二個半小時,直到它停止......都將被捆綁到同一個中斷票在表)

StartHour  StartMinute EndHour EndMinute Startime  EndTime 
    17    30    18   00 16:00:00  17:30:00 

的想法是跟蹤網站按小時停運小時,使他們能夠加入到按小時跟蹤訂單的訂單表(與訂單不會包含分鐘......幾個小時)。因此,計劃是爲兩個行進行1.5小時的停電,以便16,17和通過四捨五入的18小時值一直到30分鐘列的訂單表作爲另一點的計算(所以一個半小時將等於整整一個小時的訂單加上一個半小時的訂單......逐行分割)。這樣我可以更好地跟蹤停電期間的趨勢。

我對如何將這個邏輯寫入存儲過程感到有點不知所措。我可以想象,必須將新的小時和分鐘值聲明爲變量,並且StartHour列始終將其舍入到DATEPART小時值(即使它是16:45 ...我想將16插入到StartHour列中)。但是,對於EndHour列,我想插入向上舍入的小時值(17,然後是18,因爲我們在這種情況下超過了一個小時)進入EndHour列。這將希望描述(通過這兩行)接近兩個小時的停電事件。反過來,它將允許輕鬆加入我們的訂單表

任何有關此邏輯的存儲過程的指導將不勝感激。

+1

如果一箇中斷在某個小時完全結束*(我知道有一些機會,但可能甚至在一小時的第一分鐘內),那麼您是否仍然會在下一個小時內結束?另外,你是否必須處理跨越午夜的中斷? – 2012-04-25 07:18:05

+0

是的,你的兩個問題。如果它從3:00開始,中斷從3:01開始...我們將它記錄爲StartHour 3和EndHour 4,然後使用持續時間的分鐘數(這是我將要做的一個單獨的計算)來確定長度。然後,我們將該計算應用於訂單數量。我現在需要的只是知道如何將停機時間逐小時地放入桌子。謝謝! – Lynn 2012-04-25 07:36:52

+4

對於我的第一個問題,我的意思是 - 如果停電在2:45開始,並且*在* 3:00結束,我們插入一排(2-3)還是兩排(2-3和3-4)? – 2012-04-25 07:43:30

回答

1

好吧,我真的不明白目的! 但邏輯可能類似於如下---

declare @StartTime time 
declare @EndTime time 
declare @Temp_StartTime time 

declare @temp_StartHour int 
declare @temp_EndHour int 
declare @temp_StartMinute int 
declare @temp_EndMinute int 

SET @StartTime='2:30:00' 
SET @EndTime='4:01:00' 
SET @[email protected] 

SET @temp_StartHour=DATEPART(HOUR, @StartTime) 
SET @temp_EndHour=DATEPART(HOUR, @EndTime) 
SET @temp_StartMinute=DATEPART(MI, @StartTime) 
SET @temp_EndMinute=DATEPART(MI, @EndTime) 

if(@temp_EndMinute>0) 
    BEGIN 
     SET @[email protected]_EndHour+1 
    END 

DECLARE @Temp_Table TABLE 
(
    StartHour int, 
    StartMinute int, 
    EndHour int, 
    EndMinute int, 
    StartTime time, 
    EndTime time 
) 

WHile((@[email protected]_StartHour>=1)) 
    BEGIN 
     INSERT INTO @Temp_Table 
     SELECT (DATEPART(HOUR, @Temp_StartTime)) AS StartHour,(DATEPART(MINUTE, @Temp_StartTime)) AS StartMinute, 
     @temp_StartHour+1 AS EndHour, 
     0 AS EndMinute, @StartTime as StartTime, @EndTime as EndTime 

     SET @[email protected]_StartHour+1 
     SET @Temp_StartTime=DATEADD(HOUR,1,@Temp_StartTime) 

     if(DATEPART(MI, @Temp_StartTime)!=0) 
      BEGIN 
       SET @Temp_StartTime=DATEADD(MI,[email protected]_StartMinute,@Temp_StartTime) 
      END 
    END 

SELECT * FROM @Temp_Table 

希望能對大家有所幫助。

+0

謝謝!!!!!!我會對此進行測試,並儘快通知您。至於目的,就像我說的,邏輯就是我的老闆。我有點明白他爲什麼要這樣做,但我認識到,如果你不熟悉我們的系統,這聽起來有點奇怪。 – Lynn 2012-04-25 16:30:15

+0

它工作得很好。謝謝!!現在我可以看到你是如何做到的,我可以進一步定義邏輯並添加它。 – Lynn 2012-04-25 17:55:50

+0

很高興知道... :) – 2012-04-25 19:36:21

相關問題