带有别名列的MySQL DATEDIFF

带有别名列的MySQL DATEDIFF,mysql,sql,date,subquery,Mysql,Sql,Date,Subquery,我有一个名为start\u DATE的DATE列。我为end\u date创建了一个新的别名列,它只是下一条记录的start\u date,减去一天 现在,我还想创建另一个别名列,名为num\u days,它将输出start\u date和end\u date之间的差异。以下是我当前的查询: SELECT td1.*, ( SELECT DATE_SUB(td2.start_date, INTERVAL 1 DAY) FROM test_date td2 WHERE id

我有一个名为
start\u DATE
DATE列。我为
end\u date
创建了一个新的别名列,它只是下一条记录的
start\u date
,减去一天

现在,我还想创建另一个别名列,名为
num\u days
,它将输出
start\u date
end\u 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

但是我得到一个错误:
字段列表中的未知列“结束日期”
。我理解这是因为它不能引用同一
select
中的别名-那么我该怎么做?

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()
检索下一条记录的日期即可,这样编写起来更简单,效率也更高