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