【问题标题】:sql to_char - format based on date conditionsql to_char - 基于日期条件的格式
【发布时间】:2018-01-10 20:13:28
【问题描述】:

这是针对过去 12 个月的月度报告,例如2018 年 1 月制作,以查看 2016 年 12 月 - 2017 年 12 月。

我需要生成一个案例/何时根据条件格式化日期 - 如果 {prod_date} 是数据集中的最后一个可用月份,则格式化为周末日期(12/2/2017,12/9/2017 ,12/16/2017 等 - yyyyddmm)。但是,如果日期早于上个月,则格式为 'yyyymm'。

最终结果组应该是:

20170212
20170912
20171612
20172312
20173012
201711
201710
201709
...
201612

【问题讨论】:

  • 您似乎自相矛盾,请澄清。在一个地方你说“生产于 2018 年 1 月,所以看看 2016 年 12 月 - 2017 年 12 月”(正如任何能数数的 6 岁孩子都知道的那样,这是 13 个月,而不是 12 个月——所以也请澄清一下) .在另一个地方,您说“数据集中的最后一个可用月份。如果 2017 年数据集中的最后一个日期是 2017 年 10 月,那么这是数据集中的最后一个月,而不是 2017 年 12 月。所以 -请澄清。

标签: sql oracle date to-char


【解决方案1】:

我是这样理解您的要求的:

  1. 您想按 yyyymm 对除最后一个月以外的所有月份进行分组。
  2. 您想按 yyyyddmm 对上个月进行分组,其中 dd 应为周末(星期六)。

使用CASE 表达式检查月份。截断为 ISO 周以获得一周的星期一。加上五天得到星期六。按计算的日期字符串分组并聚合您想要的任何值。例如:

select
  grp,
  max(value1) as max_value1,
  sum(value2) as sum_value2
from
(
  select
    case when to_char(dt, 'yyyymm') = (select to_char(max(dt), 'yyyymm') from mytable)
      then to_char(trunc(dt, 'iw') + 5, 'yyyyddmm')
      else to_char(dt, 'yyyymm')
    end as grp,
    value1,
    value2
  from mytable
)
group by grp
order by grp desc;

【讨论】:

  • 我不确定您如何将“周末日期”解释为“一周的开始(星期一)” - 但 OP 还给出了 2017 年 12 月日期的明确示例,所有这些都是星期六。因此,星期更有可能意味着“从星期日到星期六”(例如在美国很常见),而“周末日期”实际上就是它所说的。
  • @mathguy:谢谢。你当然是对的。幸运的是,从星期一到星期六很容易。我只需要添加 5 天 :-)
猜你喜欢
  • 2021-12-22
  • 1970-01-01
  • 2015-09-23
  • 2020-04-13
  • 1970-01-01
  • 2018-03-02
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
相关资源
最近更新 更多