【问题标题】:how to get number of days between consecutive records in table?如何获取表中连续记录之间的天数?
【发布时间】:2013-08-01 22:17:25
【问题描述】:

在 MySQL 中,我有一个包含几列的表,其中之一是日期列。 我希望能够进行查询,以便获得一个额外的列,显示当前日期(每行的日期)和上一行的日期之间的天数。

记录的顺序是按日期,我​​按其他列过滤。

例如

id  other_col   date        days_between_dates
1   abc     2013-05-01      0
2   abc     2013-05-07      6
3   abc     2013-05-09      2
4   abc     2013-05-19      10
5   abc     2013-05-25      6
6   abc     2013-06-03      9
7   abc     2013-06-14      11

显然,由于第一行没有可比性,它应该显示0

我知道我可以使用datediff MySQL 函数获取两个日期之间的差异,例如

select datediff('2013-06-03','2013-05-25');

我的基本查询是select * from mytable where other_col = 'something' order by date; 但是我如何进行查询以直接获得示例中的结果? (我需要额外的“days_between_dates”列)。

还请注意,通常 id 是有序的,并且没有间隙,但我不能保证这一点。只是我将按日期升序排序,并按“other_col”列过滤。

【问题讨论】:

  • 表中的 id 是否保证是连续的(即它们是自动增量值,您永远不会删除行或更改自动增量值)?
  • 是的,它们是顺序的,但我不知道是否可以删除,从而在 ID 中产生“间隙”。理想情况下(以及我见过的所有情况),id 总是连续的并且没有间隙,但可能并不总是 .对于这种情况,我们假设它们确实是连续的。

标签: mysql sql date datediff


【解决方案1】:

您可以按照以下方式做一些事情:

SELECT T.id, 
       T.other_col, 
       T.yourdate, 
       IFNULL(datediff(T.yourdate,(select MAX(TT.yourdate) 
                                   FROM yourtable TT 
                                   WHERE TT.yourdate < T.yourdate 
                                   AND TT.other_col = 'abc')),0)
FROM yourtable T
where other_col = 'abc';

你可以在这个fiddle看到它

这通过计算当前记录的日期 (T.date) 与小于当前记录日期 (WHERE TT.date &lt; T.date) 的最大日期 (MAX(TT.date)) 之间的差异来工作。

当没有更小的日期时,有 COALESCE 使其为 0,而不是 null。

编辑。在第一行添加了合并以给出 0

【讨论】:

  • 它似乎有效!你介意进一步解释一下吗?特别是 datediff 的第二个参数中的内部选择,以及为什么使用 MAX 日期。
  • 更新,当我有几个不同的“other_col”值并且它们之间的日期不连续时,它不起作用,see this fiddle。我想我只需要将where 条件添加到两个选择中。让我试试。
  • 是的。您必须这样做,否则内部查询将在整个表中检查小于当前记录日期的最大日期的日期。如果您将 where 放在内部查询中,它将像您想要的那样工作。关于它的工作方式,我会用一个小的解释来更新我的答案。
  • 谢谢,如果你不介意,也可以在答案中添加wheres,这样其他人就可以看到它们,不管 cmets,对于小提琴也是一样的(所以如果我接受它,这是一个完整的答案)=)。另外,我会使用 ifnull() 代替那个“coalesce”函数,它更易于阅读。再次感谢!
  • 我制作了一个updated fiddle,其中包含一个更完整的示例,包含更多值和完整的查询
【解决方案2】:

我打算提出一个替代上述答案的方法。如果您可以保证 id 是连续的,您可以将表连接到自身以获得您正在寻找的结果:

SELECT t1.id, t1.other_col, t1.date, DATEDIFF(t2.date,t1.date)
FROM table AS t1
LEFT_JOIN table AS t2 ON t1.id = t2.id - 1

请注意,我在这里使用了 LEFT JOIN,这样 t1(主表)上的第一行和最后一行就会出现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 2015-08-31
    • 2022-01-08
    • 1970-01-01
    相关资源
    最近更新 更多