【问题标题】:SQL Query Creating Start and End DatesSQL 查询创建开始和结束日期
【发布时间】:2011-03-23 17:10:01
【问题描述】:

好吧,假设我有一个如下所示的表格:

 ID   | DATE
 2  | 2010-08-12
 2  | 2010-08-16 
 2  | 2010-08-17 
 2  | 2010-12-21 
 2  | 2010-12-22 
 2  | 2011-05-25 

任何人都知道如何查询它以使数据看起来像

 ID   | STARTDATE  | ENDDATE
 2  | 2010-08-12 | 2010-08-15
 2  | 2010-08-16 | 2010-08-16
 2  | 2010-08-17 | 2010-12-20
 2  | 2010-12-21 | 2010-12-21
 2  | 2010-12-22 | 2010-05-25

【问题讨论】:

  • 您如何计算结束日期?编辑:我想我明白了;第三个 EndDate 应该是 2010-12-20,而不是 2010-08-20?
  • ^ : 就在新开始日期之前
  • 詹姆斯,你的目标是什么平台?例如SQL Server、MySQL?

标签: sql


【解决方案1】:

我不会把 ID 放在这里,因为我认为它与查询无关。如果你愿意,你稍后再放。这是一个 MSSQL 查询。

select tb1.date as startdate,dateadd(d,-1,tb2.date) as enddate
from the_table tb1
join the_table tb2 on tb2.date>tb1.date
left join the_table tb3 on tb1.date<tb3.date and tb3.date<tb2.date
where tb3.date is null

它可以很容易地翻译成其他数据库类型。

【讨论】:

  • 这对于一些场景来说实际上是一种非常有用的方法。很酷。
【解决方案2】:

这两个链接会给你一个粗略的想法。

【讨论】:

    【解决方案3】:

    如果你有像 (1,2,3,4,5,..) 这样的序列化 id,那么你可以通过这个查询得到上面的结果,最后有 1 个额外的数据,但你可以省略它 以下是 mysql 查询

    SELECT startdate, (select startdate - INTERVAL 1 DAY from tester a where a.id = b.id +1) as enddate FROM tester b

    【讨论】: