MySQL DATEDIFF的别名列。

我有一个 DATE 列,称为 start_date. 我已经创建了一个新的别名列 end_date – 也就是 start_date 的下一条记录,减去一天。

现在我还想创建另一个别名列,叫做 num_days 之间的差值,将输出 start_dateend_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

(0)
上一篇 1天前
下一篇 1天前

相关推荐

发表评论

登录后才能评论