按月细分的日期范围



嗨,我有一个SQL问题,我试图在某个日期范围内获得每个人的月底记录。从本质上讲,我希望这个记录是跟踪历史(年价值的数据)使用某种月末记录,如果他们的开始和结束日期落在每个月的最后一天。所以目前的数据是这样的(为了简单起见,只使用2022年)…

tbody> <<tr>Jane DoeRob约翰逊
Name 起始日期 结束日期
约翰·史密斯2022-01-152022-04-10
2022-01-182022-03-05
2022-03-072022-07-18

连接两个表应该会得到期望的结果。


您没有为初始表指定表名,因此,我将把它称为person表。

您的calendar表是一个很好的开始。我不认为你需要日期栏。只需要一个EndMonth列就足够了。


JOIN person against calendarWHERE EndMonth BETWEEN StartDate AND EndDate.

你完成了!


OP报告这工作正常:

SELECT P.Name, P.StartDate, P.EndDate, C.EndMonth
FROM PERSON P, CALENDAR C
WHERE EndMonth BETWEEN StartDate AND EndDate;

这正是Teradata专有的EXPAND ON语法的用途,不需要日历表:

SELECT 
t.*
,pd        -- EXPAND ON returns a period 
,begin(pd) -- only show the start of the period
FROM records AS t
-- create a period on-the-fly, adjust the end date as periods exclude the end
EXPAND ON PERIOD(StartDate, Next(EndDate)) AS pd
BY ANCHOR MONTH_END -- return one row per month

最新更新