我有几行数据,它们的开始日期和结束日期通常是从月初到月底。然而,有时会有一些行-几个月长-从一个月的中间开始,在同一个月或未来的一个月结束-从一个月的开始开始,但在未来的一个月的中间的某个地方结束。
我需要按月打破这些日期范围,但不知道如何去做。
任何指导都是值得感谢的。
谢谢,
发布于 2011-06-08 17:37:44
你可以使用一个数字表格来完成这个任务。
在下面的示例查询中,一个名为master..spt_values的系统表被用来替换number表:
SELECT
CASE WHEN BeginDate > MonthStart THEN BeginDate ELSE MonthStart END AS BeginDate,
CASE WHEN EndDate < MonthEnd THEN EndDate ELSE MonthEnd END AS EndDate,
… /* other columns as needed */
FROM (
SELECT
d.*, /* or you could be more specific here */
(
DATEADD(month, DATEDIFF(month, 0, d.BeginDate) + v.number, 0)
) AS MonthStart,
DATEADD(day, -1,
DATEADD(month, DATEDIFF(month, 0, d.BeginDate) + v.number + 1, 0)
) AS MonthEnd
FROM RowsOfData d
INNER JOIN master..spt_values v ON v.type = 'P'
AND v.number BETWEEN 0 AND DATEDIFF(month, d.BeginDate, d.EndDate)
) s每一行都被分成一系列行,其中BeginDate要么是实际的BeginDate,要么是月初,这取决于哪个值更大,对于EndDate也是如此。为了说明这一点,下面几行
BeginDate EndDate
---------- ----------
2010-03-05 2010-03-24
2010-04-16 2010-05-05
2010-06-29 2006-08-12
2010-10-10 2011-02-01会像这样拆分:
BeginDate EndDate
---------- ----------
2010-03-05 2010-03-24
2010-04-16 2010-04-30
2010-05-01 2010-05-05
2010-06-29 2010-06-30
2010-07-01 2010-07-31
2010-08-01 2010-08-12
2010-10-10 2010-10-31
2010-11-01 2010-11-30
2010-12-01 2010-12-31
2011-01-01 2011-01-31
2011-02-01 2011-02-02发布于 2011-06-08 08:13:34
一个标准的技巧是创建一个months表,然后选择与日期范围相交的所有月份。
您可以更进一步,并在select中使用CASE语句,这样您将获得一个月份的开始日期,该日期是所提供的开始日期和月初的最大值,而该月的结束日期是所提供的结束日期和月末的最小值。
这将允许您获取单个日期范围,并获得一组月份日期范围。然后,您可以将该查询连接到您的数据集,并按月份进行分组,以将数据按月份划分为一系列月份。(当某些时间段可能没有数据,但您希望显示这些数据时,此技巧特别有用。只要使用左连接即可。)
https://stackoverflow.com/questions/6269889
复制相似问题