【问题标题】:Days between dates in a field of dates in PL/SQL, MySQL or PostgreSQL [closed]PL / SQL,MySQL或PostgreSQL中日期字段中日期之间的天数[关闭]
【发布时间】:2021-03-11 07:45:07
【问题描述】:

我有类似的东西:

  ID  |     DATE
---------------------
  A   | '2017-02-17'  
  A   | '2018-06-01'
  A   | '2020-11-27'
  B   | '2005-01-30' 
  B   | '2019-04-18'
  C   | '2016-05-18'  
  C   | '2016-05-23'
  C   | '2017-10-01'
  C   | '2020-11-28'

我需要第三列,其中包含每个日期和最后一个 bihind 之间的天数。类似

  ID  |     DATE     | DATEDIFF
--------------------------------
  A   | '2017-02-17' |    
  A   | '2018-06-01' |    469
  A   | '2020-11-27' |    910
  B   | '2005-01-30' |
  B   | '2019-04-18' |   5191
  C   | '2016-05-18' | 
  C   | '2016-05-23' |      5
  C   | '2017-10-01' |    496
  C   | '2020-11-28' |   1154

【问题讨论】:

  • 继续。尝试一下。
  • 首先确保日期列是日期类型而不是文本。但是请查看堆栈溢出的准则。它是一项帮助服务,而不是免费的编码服务。尝试返回特定数据库中的特定问题。
  • @danblack 我认为他认为这是一个你做作业的网站:)....

标签: mysql sql postgresql plsql


【解决方案1】:

根据您的 DBMS 和版本,使用以下查询之一:

SELECT *,
DATEDIFF(d, (LAG(date) OVER (ORDER BY M.id)), M.date) as datediffvalue
FROM MTB M

其他选项:

;    
WITH CTE
AS (
    SELECT rownum = ROW_NUMBER() OVER (
            ORDER BY p.id
            ), p.id, p.DATE
    FROM MTB p
    )
SELECT CTE.id, CTE.DATE, CASE 
        WHEN prev.id = CTE.id
            THEN DATEDIFF(d, prev.DATE, CTE.DATE)
        END AS datediffvalue
FROM CTE
LEFT JOIN CTE prev ON prev.rownum = CTE.rownum - 1

结果

+----+-------------------------+---------------+
| id | date                    | datediffvalue |
| A  | 2017-02-17 00:00:00.000 |               |
| A  | 2018-06-01 00:00:00.000 | 469           |
| A  | 2020-11-27 00:00:00.000 | 910           |
| B  | 2005-01-30 00:00:00.000 |               |
| B  | 2019-04-18 00:00:00.000 | 5191          |
| C  | 2016-05-18 00:00:00.000 |               |
| C  | 2016-05-23 00:00:00.000 | 5             |
| C  | 2017-10-01 00:00:00.000 | 496           |
| C  | 2020-11-28 00:00:00.000 | 1154          |
+----+-------------------------+---------------+

【讨论】:

    【解决方案2】:

    MySQL 8,窗口函数LAG

    SELECT
        t.*, DATEDIFF(date, LAG(date) OVER w) AS datediff
    FROM t 
    WINDOW w AS (PARTITION BY id ORDER BY date)
    

    MySQL 8 之前的版本

    SELECT
        DATEDIFF(date, CASE WHEN @id = id THEN @lag END) AS datediff,
        @id := id AS id,
        @lag := t.date AS date
    FROM t, (SELECT @lag := NULL, @id := NULL) var
    ORDER BY id, date
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 2015-10-28
      • 1970-01-01
      • 1970-01-01
      • 2012-11-10
      相关资源
      最近更新 更多