1

StartTime という名前の 1 つの列で時間を丸めて時間だけを表示し、それを StartHour という名前の別の列に挿入する関数を作成する必要があります。EndTime と呼ばれる別の列では、DATEPART を使用して次の増分時間に切り上げる必要もあります (例: 23:33:00.0000000 は 23 (時間) + 1 (終了時間に切り上げる) = 24 になります)それを EndHour 列に保存する必要があります)。

これらの新しい値を、StartHour と StartMinute、EndHour、および EndMinute という名前の新しい列に挿入します (StartTime 列と EndTime 列は、 time(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

ここで、この変換をストアド プロシージャに書き込む必要があります。このストアド プロシージャは、開始から終了までの長さが 1 時間以上の場合に、2 つ (停止が数時間続く場合はそれ以上) の新しい行をテーブルに挿入します。または、停止が 1 時間以下のときに 1 行だけ挿入します。そして、開始列と終了列でその 1 時間ごとの進行を説明する必要があります。 このような:

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

(上記は停止の最初の 1 時間を反映しており、下の 2 行目は、停止するまでの停止の後半の 30 時間を反映しています...両方とも、表内の同じ停止チケットに関連付けられます)

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

アイデアは、Web サイトの停止を 1 時間ごとに追跡して、注文を 1 時間ごとに追跡する注文テーブルに参加できるようにすることです (注文には分が含まれることはなく、時間だけが含まれます)。したがって、計画では、1.5 時間続く停止のために 2 つの行を作成して、16、17、および切り上げられた 18 時間ごとの値を、別のポイントとして機能する 30 分の列を持つ注文テーブルに関連付けることができます。の計算 (したがって、1 時間半は、1 時間分の注文と 30 分分の注文に相当します... 行ごとに分割されます)。このようにして、停止中の傾向をよりよく追跡できます。

このロジックをストアド プロシージャに書き込む方法については、少し途方に暮れています。おそらく、新しい時間と分の値を変数に宣言し、StartHour 列では常に DATEPART 時間の値に丸めておく必要があります (16:45 であっても... StartHour 列に 16 を挿入したい)。ただし、EndHour 列では、切り上げられた 1 時間ごとの値(この場合は 1 時間を超えたため、17 と 18)をEndHour 列に挿入したいと考えています。これにより、(これらの 2 つの行を介して) 2 時間近く停止が発生したことを説明できれば幸いです。これにより、orders テーブルへの簡単な結合が可能になります。

このロジックのストアド プロシージャに関するガイダンスをいただければ幸いです。

4

1 に答える 1

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 @Temp_StartTime=@StartTime

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 @temp_EndHour=@temp_EndHour+1
    END

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

WHile((@temp_EndHour-@temp_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 @temp_StartHour=@temp_StartHour+1
        SET @Temp_StartTime=DATEADD(HOUR,1,@Temp_StartTime)

        if(DATEPART(MI, @Temp_StartTime)!=0)
            BEGIN
                SET @Temp_StartTime=DATEADD(MI,-@temp_StartMinute,@Temp_StartTime)
            END
    END

SELECT * FROM @Temp_Table  

それが役立つことを願っています。

于 2012-04-25T08:27:38.883 に答える