2016-09-06 5 views
0

datetimeフィールドの出力を変更して、その日付が属する曜日の最初の曜日を返すようにする必要があります。たとえば、日付が9/2/2016の場合、それはその週の月曜日(月曜日ではなく、日曜日であることが望ましいため)の8/29/2016を返します。しかし、タイムスタンプを別のタイムゾーンに変換する必要もあります。その結果、私は二回のタイムゾーンを変換する必要が終わるということです。単一のSELECT文で同じ値の計算を2回削除する

CONVERT_TZ(timestamp, '+00:00', '+05:00') - INTERVAL WEEKDAY(CONVERT_TZ(timestamp, '+00:00', '+05:00')) day 

私は単にUTCの日時にINTERVAL計算を実行して、タイムゾーンの変換が結果に影響を与える可能性があるため、結果にタイムゾーンを変換することはできません例えば、WEEKDAY関数の2016-9-5 00:00 UTCの日時は、実際にESTの9/4になるため、別の週の一部になります。

ステートメントでCONVERT_TZを2回コールする必要はありませんか?

答えて

1

サブクエリーに入れることができます。

SELECT converted - INTERVAL WEEKDAY(converted) AS day 
FROM (SELECT CONVERT_TZ(timestamp, '+00:00', '+05:00') AS converted 
     FROM yourTable) AS x 

もう1つの方法は、ユーザー変数を割り当てることです。 2回使用できるようにするには、代入をIF()式の条件部分に入れます。これは、代入が使用前に行われることを保証します。

IF(@converted := CONVERT_TZ(timestamp, '+00:00', '+05:00'), 
    @converted - INTERVAL(WEEKDAY(@converted) DAY, 
    NULL) AS day 
+0

確かに1つの方法ですが、これは現在のクエリよりもはるかにパフォーマンスが低いです。サブクエリをすでに使用している場合は、これが良いオプションになると思います。 – maxedison

+0

ユーザー定義変数を使用して別の方法でこれを実行します。興味深いもの: – Barmar

+0

あなたは実際にこれをお勧めしますか、私はちょうど私が持っているものに固執する必要がありますか? – maxedison

関連する問題