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'
我真的希望这是有道理的.如果我需要澄清它,请告诉我!谢谢你的帮助 :)
如果您使用的是 SQL Server 2012,则可以使用lag或lead来实现此目的。相反,我将使用相关子查询:
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)
内部子查询获取下一个周期的日期。对于具有同一时期记录的连续记录也是如此。然后我可以用它来分组。