これを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に変更できることはわかっていますが、クエリを動的かつスマートにしたいと考えています。
解決策は次のとおりです。
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にインターバルタイプが存在することすら知りませんでした。私を助けてくれたこのページに感謝します:
私が正しく理解していれば、間隔にいくつかの数値を掛けたいと思います。信じられないかもしれませんが、文字通りあなたがする必要があるのはそれだけです:
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の「チートシート」にはこの小さな例がかなり前からあります。
2つの意見:
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