我有一个 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
– 那么我该怎么做呢?
解决方案:
别名定义在 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()
来检索下一条记录的日期,这样写起来既简单又高效。
本文来自投稿,不代表实战宝典立场,如若转载,请注明出处:https://www.shizhanbaodian.com/18063.html