我怎样才能在甲骨文中撤回一个月的日子

时间:2013-08-19 08:25:23

标签: oracle date

select l.id, l.surname, l.fname, LAST_DAY(ADD_MONTHS('02.03.2013', -2)) + level, 
TO_CHAR(T.fdate,'DD.MM.YYYY') FDATE from pers_log t, pers_list l 
where t.id=l.id and t.id='1316' 
CONNECT BY NOCYCLE level <= LAST_DAY(ADD_MONTHS('02.09.2013', -1)) - LAST_DAY(ADD_MONTHS('02.09.2013', -2))

我在表单中写了一个查询。但进入了无限循环。尽管等待很长时间都没有返回结果。 我不明白我哪里错了...... (请注意,该月的日期)

21 aaaa bbbbb 01.08.2013  (note:pers_log fdate is not null)
2 aaaa bbbbb 02.08.2013 (note:pers_log fdate is not null)
23 aaaa bbbbb 03.08.2013 (note:pers_log fdate is not null)
null null null 04.08.2013 
55 aaaa bbbbb 05.08.2013 (note:pers_log fdate is not null)
null null null 06.08.2013 
....
null null null 27.08.2013 
28 aaaa bbbbb 28.08.2013 (note:pers_log fdate is not null)
null null null 29.08.2013 
60 aaaa bbbbb 30.08.2013 (note:pers_log fdate is not null)
51 aaaa bbbbb 31.08.2013 (note:pers_log fdate is not null)

毕竟以下不是问题,但是我找不到像上面的查询那样进入无限循环的原因。

select l.id, l.surname, l.fname 
TO_CHAR(T.fdate,'DD.MM.YYYY') FDATE from pers_log t, pers_list l 
and to_char(t.FDATE, 'YYYY')='2013' and to_char(t.FDATE, 'MM')='08' and t.id='1316' 
order by FDATE asc

21 aaaa bbbbb 01.08.2013  
2 aaaa bbbbb 02.08.2013 
23 aaaa bbbbb 03.08.2013 
55 aaaa bbbbb 05.08.2013 
28 aaaa bbbbb 28.08.2013 
60 aaaa bbbbb 30.08.2013 
51 aaaa bbbbb 31.08.2013 

我在上面写的查询结果是什么,以下查询返回错误,原因和结果,但

1 个答案:

答案 0 :(得分:0)

我仍然觉得很难弄清楚你想要做什么,但我你的意思是你要列出查询日期前一个月的所有日子,并显示匹配来自pers_log and pers_list`的数据(如果存在),否则为null?

如果是这样,那就是你需要的东西:

select t.id, l.surname, l.fname, to_char(x.target_date, 'DD.MM.YYYY')
from (
  select last_day(add_months(to_date('02.09.2013', 'DD.MM.YYYY'), -2))
    + level as target_date
  from dual
  connect by level <= last_day(add_months(to_date('02.09.2013', 'DD.MM.YYYY'), -1))
    - last_day(add_months(to_date('02.09.2013', 'DD.MM.YYYY'), -2))
) x
left join pers_log t on t.fdate = x.target_date
  and t.id=1316
left join pers_list l on l.id = t.id
order by x.target_date;

内部选择会生成上个月的所有日期,作为我无法想象地称为x的内联视图。然后为了获得可能的匹配数据,我已经将外连接用于实际表,这意味着如果没有匹配则将显示空值。

如果fdate有时间组件,那么您需要在连接条件中忽略它。你可以这样做:

on trunc(t.fdate) = x.target_date

on t.fdate >= x.target_date and t.fdate < x.target_date + 1

当然,我可能已经开始了解你的实际行动。你的原始查询根本没有过滤日期,因为它们之间没有连接,所以你可能会得到很多结果 - 我认为它只是获得了比你预期的更多的数据,因此需要更长的时间检索数据。这与无限循环不同,但我看不出你实际上有一个循环。