【问题标题】:Get list of all possible dates based on particular days [oracle 11g]根据特定日期获取所有可能日期的列表 [oracle 11g]
【发布时间】:2016-05-24 00:38:00
【问题描述】:

我有presentation 表包括:

ID     DAY         START       END      STARTDATE       ENDDATE
622   Monday     12:00:00    02:00:00   01-05-2016     04-06-2016 
623   Tuesday    12:00:00    02:00:00   01-05-2016     04-06-2016 
624   Wednesday  08:00:00    10:00:00   01-05-2016     04-06-2016 
625   Thursday   10:00:00    12:00:00   01-05-2016     04-06-2016 

我想列出从STARTDATEENDDATE 的所有可能日期。我尝试了一个有效的查询,除了它将列出每个 ID 的所有可能的日期。我可能只需要一个 ID,因为所有行基本上都有相同的日期。

查询:

select 
  A.PRESENTATIONID,
  A.PRESENTATIONDATESTART+delta dt
from 
  PRESENTATION A, 
  (
     select level-1 as delta 
     from dual 
     connect by level-1 <= (
       select max(PRESENTATIONDATEEND- PRESENTATIONDATESTART) from PRESENTATION
     )
  )
where A.PRESENTATIONDATESTART+delta <= A.PRESENTATIONDATEEND
order by 1,2;

结果:

622 01-05-2016 12:00:00 //startdate
.....
622 03-06-2016 12:00:00
622 04-06-2016 12:00:00 //enddate
.....
625 04-06-2016 12:00:00

结果很繁琐!

我只想列出存储在我的presentation 表中的可能日期。例如,在presentation 表中,日期为星期一、星期二、星期三和星期四。可能的结果是:

MONDAY
02-05-2016 12:00:00
09-05-2016 12:00:00
16-05-2016 12:00:00
23-05-2016 12:00:00
30-05-2016 12:00:00

TUESDAY
03-05-2016 12:00:00
10-05-2016 12:00:00
17-05-2016 12:00:00
24-05-2016 12:00:00
31-05-2016 12:00:00
.... until THURSDAY

在解释的过程中,在这个问题中,我想排除周五、周六和周日的日期。有可能吗?

更新

新查询:

select 
  A.PRESENTATIONID,
  A.PRESENTATIONDAY,
  A.PRESENTATIONDATESTART+delta dt
from 
  PRESENTATION A, 
  (
     select level-1 as delta 
     from dual 
     connect by level-1 <= (
       select max(PRESENTATIONDATEEND- PRESENTATIONDATESTART) from PRESENTATION
     )
  )
where A.PRESENTATIONDATESTART+delta <= A.PRESENTATIONDATEEND
and
  a.presentationday = trim(to_char(A.PRESENTATIONDATESTART+delta, 'Day'))
order by 1,2,3;

结果:

622 Monday  02-05-2016 12:00:00
622 Monday  09-05-2016 12:00:00
622 Monday  16-05-2016 12:00:00
622 Monday  23-05-2016 12:00:00
622 Monday  30-05-2016 12:00:00
623 Tuesday 03-05-2016 12:00:00
623 Tuesday 10-05-2016 12:00:00
623 Tuesday 17-05-2016 12:00:00
623 Tuesday 24-05-2016 12:00:00
623 Tuesday 31-05-2016 12:00:00
624 Wednesday   04-05-2016 12:00:00
624 Wednesday   11-05-2016 12:00:00
624 Wednesday   18-05-2016 12:00:00
624 Wednesday   25-05-2016 12:00:00
624 Wednesday   01-06-2016 12:00:00
625 Thursday    05-05-2016 12:00:00
625 Thursday    12-05-2016 12:00:00
625 Thursday    19-05-2016 12:00:00
625 Thursday    26-05-2016 12:00:00
625 Thursday    02-06-2016 12:00:00

您可以查看日历以查看日期和日期是否匹配:D 再次感谢您@dcieslak!

【问题讨论】:

  • 您的意思不是在您的输出中显示 MONDAY 和 TUESDAY 字面意思,对吗?您希望星期几显示在单独的列中吗?
  • No No.. 这只是为了让人们了解我试图实现的目标哈哈@mathguy

标签: oracle date oracle11g


【解决方案1】:

添加到您的查询中:

 and
  a.day = trim(to_char(A.PRESENTATIONDATESTART+delta, 'Day'))

它将删除不等于您的 DAY 列的天数。 trim 对“Day”很重要,因为我们希望去掉前导和尾随空格。

【讨论】:

  • 我必须用什么东西代替'Day'吗?它是什么? @dcieslak
  • 忽略我的第一条评论。我只是想出了解决方案:D 非常感谢!但我还有一个问题……
  • 但是......但是......从原始问题来看,接受的答案如何达到要求,即日期应该只显示一次,而不是为每个 ID 重复?孟?你改变主意了吗,现在的要求不一样了吗?
  • @mathguy 日期​​只显示一次。日列删除重复。
  • @mathguy 你怎么理解我的问题?我将根据来自 dcieslak 的其他查询和结果更新我的最新答案:)
猜你喜欢
  • 1970-01-01
  • 2019-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
相关资源
最近更新 更多