【问题标题】:MySQL DATEDIFF with an Alias column带有别名列的 MySQL DATEDIFF
【发布时间】:2020-08-16 22:10:03
【问题描述】:

我有一个名为start_dateDATE 列。我为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 中引用别名 - 那我该怎么做?

【问题讨论】:

    标签: mysql sql date subquery


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-14
      • 1970-01-01
      相关资源
      最近更新 更多