SQL:从这样的数据中获取期间开始和结束日期时间?棘手的小谜题我正在努力

use*_*130 5 sql datetime group-by sql-server-2008

我有一张表格,列出了一年中的每个日期.每行还包含一个从1到13的周期数,每年循环一次.它看起来像这样:

|        Date         | Period |
| 2012-12-27 00:00:00 |   12   |
| 2012-12-28 00:00:00 |   12   |
| 2012-12-29 00:00:00 |   13   |
| 2012-12-30 00:00:00 |   13   |
| 2012-12-31 00:00:00 |   13   |
| 2013-01-01 00:00:00 |   13   |
| 2013-01-02 00:00:00 |   13   |
|        . . .        |   13   | 
| 2013-02-10 00:00:00 |   01   |
|        . . .        |   01   | 
| 2013-03-14 00:00:00 |   02   |
|        . . .        |   02   | 
| 2013-05-05 00:00:00 |   03   |
Run Code Online (Sandbox Code Playgroud)

如您所见,第13期从2012年12月29日开始,到2013年2月9日结束.我通过获取第13期的第一个和最后一个日期来解决这个问题.

我需要编写一个查询来获取当前期间的期间开始和结束日期.但是我遇到了问题,因为这些时期有时会发生在一年两次,有时会像这个例子那样重叠.

还有一些例子:

如果getDate()='2013-02-25 13:45:00',则期间应为01,开始和结束日期为'2013-02-10 00:00:00'和'2013-03-14 00:00:00'

如果getDate()='2013-03-15 00:00:00',则期间应为02,开始和结束日期为'2013-03-14 00:00:00'和'2013-05-05 00:00:00'

我真的希望这是有道理的.如果我需要澄清它,请告诉我!谢谢你的帮助 :)

Gor*_*off 4

如果您使用的是 SQL Server 2012,则可以使用laglead来实现此目的。相反,我将使用相关子查询:

select min(period) as period, MIN(date), MAX(date)
from (select t.*,
             (select min(date) from t t2 where t2.period <> t.period and t2.date > t.date) as nextp
      from t
     ) t
group by nextp
Run Code Online (Sandbox Code Playgroud)

内部子查询获取下一个周期的日期。对于具有同一时期记录的连续记录也是如此。然后我可以用它来分组。