3

したがって、次のようなクエリがあります。

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 句が評価されるときに、列の値がまだ決定されていない可能性があるためです。

したがって、そのアプローチは水中で死んでいるように見えます。

このような繰り返し式を使用してクエリを作成する人は、どのように対処すればよいのでしょうか?

4

2 に答える 2

5

派生テーブルでエイリアスを定義し、外側のクエリでそれらを参照できます。

SELECT callTimeZoned, callLength,
    DATE_FORMAT(callTimeZoned,'%b %d %Y') as callDate, 
    DATE_FORMAT(callTimeZoned,'%H:%i') as callTimeOfDay 
FROM (
    SELECT
        CONVERT_TZ(callTime,'+0:00','-7:00') as callTimeZoned,
        SEC_TO_TIME(callLength) as callLength
    FROM cs_calldata
    WHERE customerCode='5999999-abc-blahblahblah'
) AS d
WHERE 
    callTimeZoned BETWEEN '2010-04-25' AND '2010-05-25'
于 2010-05-26T02:26:14.437 に答える
1
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' having
    callTimeZoned >= '2010-04-25' AND
    callTimeZoned <= '2010-05-25'

(最後から 3 行目のからANDへの切り替えに注意してください。)having

于 2012-04-12T11:58:34.193 に答える