したがって、次のようなクエリがあります。
SELECT id,
DATE_FORMAT(CONVERT_TZ(callTime,'+0:00','-7:00'),'%b %d %Y') as callDate,
DATE_FORMAT(CONVERT_TZ(callTime,'+0:00','-7:00'),'%H:%i') as callTimeOfDay,
SEC_TO_TIME(callLength) as callLength
FROM cs_calldata WHERE
customerCode='999999-abc-blahblahblah' AND
CONVERT_TZ(callTime,'+0:00','-7:00') >= '2010-04-25' AND
CONVERT_TZ(callTime,'+0:00','-7:00') <= '2010-05-25'
あなたが私のような人なら、おそらく、CONVERT_TZ(callTime,'+0:00','-7:00')
4 つの別々の時間を計算するように要求していなければ、このクエリの可読性とパフォーマンスが向上するのではないかと考え始めるでしょう。
そのため、その式の列エイリアスを作成し、それ以降の出現をそのエイリアスに置き換えようとします。
SELECT id,
CONVERT_TZ(callTime,'+0:00','-7:00') as callTimeZoned,
DATE_FORMAT(callTimeZoned,'%b %d %Y') as callDate,
DATE_FORMAT(callTimeZoned,'%H:%i') as callTimeOfDay,
SEC_TO_TIME(callLength) as callLength
FROM cs_calldata WHERE
customerCode='5999999-abc-blahblahblah' AND
callTimeZoned >= '2010-04-25' AND
callTimeZoned <= '2010-05-25'
これは、MySQLマニュアルを引用することを学んだときです:
標準 SQL では、WHERE 句での列エイリアスへの参照は許可されていません。この制限が課されるのは、WHERE 句が評価されるときに、列の値がまだ決定されていない可能性があるためです。
したがって、そのアプローチは水中で死んでいるように見えます。
このような繰り返し式を使用してクエリを作成する人は、どのように対処すればよいのでしょうか?