首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按月划分日期范围

按月划分日期范围
EN

Stack Overflow用户
提问于 2011-06-08 02:27:09
回答 2查看 2.5K关注 0票数 2

我有几行数据,它们的开始日期和结束日期通常是从月初到月底。然而,有时会有一些行-几个月长-从一个月的中间开始,在同一个月或未来的一个月结束-从一个月的开始开始,但在未来的一个月的中间的某个地方结束。

我需要按月打破这些日期范围,但不知道如何去做。

任何指导都是值得感谢的。

谢谢,

EN

回答 2

Stack Overflow用户

发布于 2011-06-08 17:37:44

你可以使用一个数字表格来完成这个任务。

在下面的示例查询中,一个名为master..spt_values的系统表被用来替换number表:

代码语言:javascript
运行
复制
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也是如此。为了说明这一点,下面几行

代码语言:javascript
运行
复制
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

会像这样拆分:

代码语言:javascript
运行
复制
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
票数 2
EN

Stack Overflow用户

发布于 2011-06-08 08:13:34

一个标准的技巧是创建一个months表,然后选择与日期范围相交的所有月份。

您可以更进一步,并在select中使用CASE语句,这样您将获得一个月份的开始日期,该日期是所提供的开始日期和月初的最大值,而该月的结束日期是所提供的结束日期和月末的最小值。

这将允许您获取单个日期范围,并获得一组月份日期范围。然后,您可以将该查询连接到您的数据集,并按月份进行分组,以将数据按月份划分为一系列月份。(当某些时间段可能没有数据,但您希望显示这些数据时,此技巧特别有用。只要使用左连接即可。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6269889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档