0

我有一个包含日期的表格,我想用第二个日期减去第一个日期,用第三个日期减去第二个日期,依此类推,直到最后一个 n-1 加上 n。

我该如何为此编写查询?

该表将被称为随机,列名是日期

 date       
+------------+
| 2009-06-20 |
| 2010-02-12 |
| 2012-03-14 |
| 2013-09-10 |
| 2014-01-01 |
| 2015-04-10 |
| 2015-05-01 |
| 2016-01-01 |
+------------+
4

3 回答 3

0

使用 ROW_NUMBER 进行行号编号,然后使用子查询计算差异

SELECT  column_date 
,DATEDIFF( D , column_date 
,(SELECT column_date FROM
    (
    SELECT  column_date , ROW_NUMBER() OVER ( ORDER BY column_date) AS RowMum
     FROM table_Random AS tBL_1
    ) AS tbl_2
       WHERE tbl_2.RowMum= tBL_1.RowMum-1
 )
         ) DIFF
FROM 
(
SELECT  column_date , ROW_NUMBER() OVER ( ORDER BY column_date) AS RowMum
FROM table_Random
) AS tBL_1
于 2018-07-26T06:13:38.287 回答
0

你需要得到下一个日期。我会使用相关的子查询:

select t.date,
       (select min(t2.date)
        from t t2
        where t2.date > t.date
       ) as next_date
from t;

您只需要使用datediff()天数即可获得差异。

于 2018-07-25T16:17:42.113 回答
-1

我第一次写答案时没有注意到 mysql 标签,所以现在用 MySQL 8.0 fiddle 的链接更新它

https://www.db-fiddle.com/f/myUJYeFrMXmU1piQXAmnv4/0

/* tested against MySQL v8.0 */
WITH T(d) AS (
    SELECT '2009-06-20' as d 
    UNION
    SELECT '2010-02-12'
    UNION
    SELECT '2012-03-14'
    UNION
    SELECT '2013-09-10'
    UNION
    SELECT '2014-01-01'
    UNION
    SELECT '2015-04-10'
    UNION
    SELECT '2015-05-01'
    UNION
    SELECT '2016-01-01'
), LAGGED(d, next_d) AS (
    SELECT d, LEAD(d) OVER (ORDER BY d ASC) AS next_d
    FROM T
)
/* datediff args are in opposite order to SQL server.  Also,
  only day part is considered */
SELECT l.d, l.next_d, DATEDIFF(l.next_d, l.d) AS n_days
 FROM LAGGED AS l

这是我针对 SQL Server 的原始答案:

WITH T(d) AS (
  SELECT d FROM (
  VALUES 
  ('2009-06-20'),
  ('2010-02-12'),
  ('2012-03-14'),
  ('2013-09-10'),
  ('2014-01-01'),
  ('2015-04-10'),
  ('2015-05-01'),
  ('2016-01-01')
  ) AS T1(d)
), LAGGED(d, next_d) AS (
   SELECT d, LEAD(d) OVER (ORDER BY d ASC) AS next_d
   FROM T
)
SELECT l.d, l.next_d, DATEDIFF(DAY, l.d, l.next_d) AS n_days
FROM LAGGED AS l

并产生这个输出(以我所做的繁琐的手工编辑为模):

 
  d next_d n_days
  2009-06-20 2010-02-12 237
  2010-02-12 2012-03-14 761
  2012-03-14 2013-09-10 545
  2013-09-10 2014-01-01 113
  2014-01-01 2015-04-10 464
  2015-04-10 2015-05-01 21
  2015-05-01 2016-01-01 245
  2016-01-01 空空
于 2018-07-25T18:08:45.447 回答