如何查找一周中的月份数(包括两个月)

时间:2018-11-01 15:54:40

标签: sql oracle plsql

我有一个表,其中包含num_client,天,周,并且我想计算每周的客户数 这是表中的一些数据:

num_client,   day,  week
1       01/01/2018     1
2       01/01/2018     1
.
.
.
1       09/01/2018     2
3       10/01/2018     2
.
.
.
.
1       28/01/2018     5
1       01/02/2018     5
2       01/02/2018     5
5       01/02/2018     5

。 。 。 依此类推。

我按功能分组,一切正常。 问题是,当我尝试在汇总查询中添加星期几时,有些星期的间隔太小了, 就像2018年的第5周,它包含两个月,一月和二月。

所以我想到的是看天数:如果第二周的第五周比一月多,那么第五周的月份就是二月。 而且每年。 他们在oracle中有任何动态功能吗?

1 个答案:

答案 0 :(得分:2)

这是一种根据您所说的逻辑(例如,如果一周中的最后一个日期是日期的第1,第2,第3或第4个)生成日期及其对应的星期和星期-月份值的列表的方法。月,该周属于上个月):

WITH week_months AS (SELECT dt,
                            dt_week_start,
                            dt_week_end,
                            to_number(to_char(dt, 'ww')) week_no,
                            to_number(CASE WHEN TRUNC(dt_week_start, 'mm') != TRUNC(dt_week_end, 'mm') AND to_char(dt_week_end, 'dd') < '05' THEN to_char(dt_week_start, 'mm')
                                           ELSE to_char(dt_week_end, 'mm')
                                      END) mnth
                     FROM   (SELECT to_date('01/01/2018', 'dd/mm/yyyy') -1 + LEVEL dt,
                                    trunc(to_date('01/01/2018', 'dd/mm/yyyy') -1 + LEVEL, 'ww') dt_week_start,
                                    trunc(to_date('01/01/2018', 'dd/mm/yyyy') -1 + LEVEL, 'ww') + 6 dt_week_end
                             FROM   dual
                             CONNECT BY LEVEL <= 400))
SELECT *
FROM   week_months
ORDER BY dt;

您可以动态地使用它(您必须更改week_months子查询中的内部选择以选择您感兴趣的日期;这里我只是从2018年1月1日开始选择了400天,但您可能需要表中的最小/最大日期),但是根据查询运行的频率,您可能会发现最好填充一个表,然后使用该表连接到其他表。