【问题标题】:Banding a date range in oracle在 oracle 中绑定日期范围
【发布时间】:2012-02-19 01:51:45
【问题描述】:

我希望在 Oracle 11 中将一行分成月份。

例如,假设我有架构:

CREATE TABLE MY_TABLE (
  A_FIELD VARCHAR2(45),
  START_DATE DATE,
  END_DATE DATE
);

带有如下条目:"foo", 1-1-2011, 1-1-2012

有没有办法查询表,这样我得到的结果集如下:

"foo", Jan-11
"foo", Feb-11
"foo", Mar-11
"foo", Apr-11
"foo", May-11
.....
"foo", Jan-12

我一直在尝试使用 CONNECT BY LEVEL、MONTHS_BETWEEN 等的各种方法,但我似乎无法完全正确。

感谢大家的帮助。

【问题讨论】:

标签: sql database date plsql oracle11g


【解决方案1】:

试试这个。在这个解决方案中有几个假设。一个是 end_date 和 start_date 之间不超过 200 个月 - 您可以根据需要调整查询中的 200。第二个假设是一个月中的哪一天总是一样的。如果不是这种情况,您可以轻松地调整查询以完全忽略这一天。但它应该能让你完成 99% 的工作——如果你需要澄清,请告诉我。

select a.A_FIELD, to_char(add_months(a.START_DATE,r), 'Mon-yy') as display_month
from MY_TABLE a, (
    select rownum-1 r 
    from all_objects
    where rownum <= 200) b
where add_months(trunc(a.START_DATE,'mm'),r) <= trunc(a.END_DATE,'mm')
order by A_FIELD, b.r

【讨论】:

  • 刚刚修复了边缘情况问题,即月份中的日期并不总是相同,使用:add_months(trunc(a.START_DATE,'mm'),r)
  • @eric 不客气!如果您喜欢这个答案,别忘了给它投票,如果它是您选择的答案,请接受它。
  • 呵呵!必须从某个地方开始:-)
猜你喜欢
  • 1970-01-01
  • 2018-04-11
  • 2016-10-25
  • 2014-06-09
  • 2010-11-03
  • 1970-01-01
  • 2014-05-20
  • 1970-01-01
  • 2011-03-29
相关资源
最近更新 更多