web-dev-qa-db-ja.com

計算された間隔を使用して日付/時刻コンポーネントを加算/減算する方法は?

これをTeradataで機能させたい:

より良い例のためにSQLを更新

select
case
    when 
        current_date between
        cast('03-10-2013' as date format 'mm-dd-yyyy') and
        cast('11-03-2013' as date format 'mm-dd-yyyy')
    then 4
    else 5
end Offset,
(current_timestamp + interval Offset hour) GMT

ただし、Expected something like a string or a Unicode character blah blahのエラーが発生します。次のように間隔をハードコーディングする必要があるようです。

select current_timestamp + interval '4' day

はい、最初の例でハードコーディングしたことは知っていますが、それは計算結果を示すためだけのものでした。

知っておく必要がある場合は、いくつかのテーブルのすべての日付と時刻をGMTに変換する必要がありますが、夏時間を考慮する必要があります。私は東部にいるので、日付がDST時間枠内にある場合は4時間を追加し、それ以外の場合は5時間を追加する必要があります。

期間ごとに個別の更新ステートメントを作成し、それに応じて値を4から5に変更できることはわかっていますが、クエリを動的かつスマートにしたいと考えています。

6

解決策は次のとおりです。

select
case
    when 
        current_date between
        cast('03-10-2013' as date format 'mm-dd-yyyy') and
        cast('11-03-2013' as date format 'mm-dd-yyyy')
    then 4
    else 5
end Offset,
(current_timestamp + cast(Offset as interval hour)) GMT

実際には、caseステートメントの戻り値を間隔としてキャストする必要があります。 Teradataにインターバルタイプが存在することすら知りませんでした。私を助けてくれたこのページに感謝します:

http://www.teradataforum.com/l081007a.htm

5

私が正しく理解していれば、間隔にいくつかの数値を掛けたいと思います。信じられないかもしれませんが、文字通りあなたがする必要があるのはそれだけです:

select  current_timestamp                    as right_now
      , right_now +      (interval '1' day)  as same_time_tomorrow
      , right_now + (2 * (interval '1' day)) as same_time_next_day

インターバルは常に何らかの理由で私に挑戦してきました。あまり使いません。しかし、Teradataの「チートシート」にはこの小さな例がかなり前からあります。

4
BellevueBob

2つの意見:

  • INTの代わりにINTERVALを返すことができます
  • Teradataで日付リテラルを書き込むための推奨される方法は、CAST/FORMATではなくDATE'YYYY-MM-DD 'です。

    select
        case
            when current_date between DATE '2013-03-10' and DATE '2013-11-03'
            then interval '4' hour
            else interval '5'hour
        end AS Offset,
        current_timestamp + Offset AS GMT
    
0
dnoeth