【问题标题】:How to find number months of week including two months如何找到包括两个月在内的一周中的月份数
【发布时间】:2018-11-01 15:54:39
【问题描述】:

我有一个包含 num_client、day、week 的表,我想计算每周的客户数量 这是表中的一些数据:

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 周一样,它包括两个月,一月和二月。

所以我想到的是查看天数:如果第 5 周 2 月的天数比 1 月多,那么第 5 周的月份就是 2 月。 每年都是这样。 他们是否有任何动态功能可以在 oracle 中执行此操作?

【问题讨论】:

  • 不,没有这样做的函数,你必须编写自定义函数或查询
  • 过去几周我一直在尝试这样做,但我没有成功,你知道怎么做吗?
  • 我确实知道——我已经研究和使用数据库 25 年了。这个网站不适合想要聘请顾问的人,但是,您需要对您所做的一些工作提出问题——人们不仅有兴趣为您编写它。告诉我你在过去几周尝试过的东西,我会告诉你为什么它不起作用或帮助你调试问题。
  • 我给你一个提示。解决此问题的最简单方法是制作一个表格,其中包含一年中的每一天的一行和一个包含您要映射到的“周数”的列。那么“计算”就是一个简单的连接。
  • 很好——那么你得到了你想要的。 :D

标签: sql oracle plsql


【解决方案1】:

这是一种根据您所说的逻辑生成日期列表及其对应的周和周月值的方法(即,如果一周中的最后一个日期是第一天、第二天、第三天或第四天)月,周属于上个月):

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 天,但您可能需要表中的最小/最大日期),但根据查询运行的频率,您可能会发现填充表并使用它连接到其他表会更好。

【讨论】:

  • 对我实际寻找的内容稍作调整,效果很好,如上所述,我创建了一个包含此查询的表,几乎没有更改,然后我从主表进行了联接我想使用的和带有查询结果的表。谢谢楼主
  • 除非您从现在到时间结束(或至少是 Oracle 的结束时间!*{;-))填充表,否则您将需要一个添加行的过程对于未来的日期。不过,希望你已经掌握了它
  • 是的,当然,我将条件从
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多