MySQL DATEDIFF с колонкой Alias - PullRequest
0 голосов
/ 02 мая 2020

У меня есть столбец DATE с именем start_date. Я создал новый столбец псевдонимов для end_date - это просто start_date следующей записи минус один день.

Теперь я также хочу создать еще один столбец псевдонимов с именем num_days, который будет выводить разница между start_date и end_date. Вот мой текущий запрос:

SELECT td1.*,
(
    SELECT DATE_SUB(td2.start_date, INTERVAL 1 DAY)
    FROM test_date td2
    WHERE id = td1.id + 1
) AS end_date,

DATEDIFF(end_date, td1.start_date) AS num_days

FROM test_date td1

Однако я получаю сообщение об ошибке: Unknown column 'end_date' in 'field list'. Я понимаю, что это потому, что он не может ссылаться на псевдоним в том же select - так как мне это сделать?

1 Ответ

1 голос
/ 02 мая 2020

Псевдонимы, определенные в предложении SELECT, не могут быть повторно использованы в том же предложении. Вам нужно либо повторить выражение, либо использовать производную таблицу (cte или подзапрос).

Второй вариант будет выглядеть так:

SELECT
    t.*,
    DATEDIFF(end_date, td1.start_date) AS num_days
FROM (
    SELECT 
        td1.*,
        (
            SELECT td2.start_date - INTERVAL 1 DAY
            FROM test_date td2
            WHERE id = td1.id + 1
        ) AS end_date
    FROM test_date td1
) t

В качестве альтернативы, вы также можете присоединиться:

SELECT
    td1.*,
    td2.start_date - INTERVAL 1 DAY
    DATEDIFF(td2.start_date, td1.start_date) - 1 AS num_days
FROM test_date td1
LEFT JOIN test_date td2 ON td2.id = td1.id + 1

Примечание: если вы используете MySQL 8.0, вы можете просто использовать LEAD(), чтобы получить дату следующей записи, что будет проще и эффективнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...