2016-10-26 6 views
0

テーブルの日付を調整するコードブロックがあります。SQL:Function/Procedureによる計算を統合しますか?

dateadd(hh, 
case 
    when 
     month(planned_start)=1 or 
     month(planned_start)=2 or 
     month(planned_start)=11 or 
     month(planned_start)=12 then -5 
    when 
     month(planned_start)=3 then 
      case 
       when datepart(hh,planned_start)<6 then -5 
      else -4 
      end 
    else -4 
end 
,planned_start) 

基本的に、私は時差を調整する必要がありますが、SQLの複数の場所で日付を調整する必要があります。今、私はこのコードブロックを約8回繰り返しています。

これを関数またはプロシージャにする方法はありますか?関数に 'planned_start'を送信して計算を実行し、日付を調整するのに必要な '-4または-5'を返しますか?

注: 'planned_start'と時間オフセットはデータの行ごとに異なる可能性があるため、変数を使用するだけでは不十分だとは思いません。

ありがとうございました。ここで

+0

手順コードは**ベンダー固有の** ** - だからp 'mysql'、' postgresql'、 'sql-server'、' oracle'、 'db2'のどれかを指定するタグを追加してください。 –

+0

ああ、申し訳ありません。 「About」に「Microsoft SQLServer2008」と書いてあります。 –

答えて

1

はクエリの簡易版は

SELECT Dateadd(hh, CASE 
        WHEN Month(planned_start) IN (1, 2, 11, 12) 
          OR (Datepart(hh, planned_start) < 6 
           AND Month(planned_start) = 3) THEN -5 
        WHEN Month(planned_start) = 3 
          AND Datepart(hh, planned_start) >= 6 THEN -4 
        ELSE -4 
        END, planned_start) 

であるとはい、あなたはfunctionを作成し、それを使用するには、コード

CREATE FUNCTION dbo.Dateadjust (@DATE DATETIME) 
RETURNS DATETIME 
AS 
    BEGIN 
     DECLARE @result DATETIME; -- previously it was int 

     SELECT @result = Dateadd(hh, CASE 
            WHEN Month(@DATE) IN (1, 2, 11, 12) 
              OR (Datepart(hh, @DATE) < 6 
               AND Month(@DATE) = 3) THEN -5 
            WHEN Month(@DATE) = 3 
              AND Datepart(hh, @DATE) >= 6 THEN -4 
            ELSE -4 
            END, @DATE) 

     RETURN(@result); 
    END; 

GO 

の大きな塊を繰り返すのではなくあなたのクエリを使用することができますSELECTステートメント

select planned_start,dbo.Dateadjust(planned_start) 
From yourtable 
+0

これは非常に役に立ちました。しかし、私はいくつかのエラーが発生しています。 「日時からINTへの暗黙的な変換は許可されていません。CONVERTを使用してください。 「ユーザー定義関数dbo.DateAdjustが見つかりません」何か案は?ありがとう。ああ、私はいくつかのことを調整し、受け取った: "CREATE FUNCTION権限がデータベース 'SM'で拒否されました。 –

+0

@DonTrembly - ええ、関数 '@ result'のデータ型に間違いがありました。新しいコード –

+0

で機能を変更してください。さて、うまくいきました。今私はエラーが発生します: "CREATE FUNCTION権限がデータベース 'SM'で拒否されました。 –

関連する問題