SQL-запрос oracle для отображения всех дат предыдущего месяца

Ребята, у меня есть требование перечислить все даты предыдущего месяца, как показано ниже.

20101201
20101202
20101203
20101204
20101205
..
..
..
..
..
..
..
..
20101231

любезно дайте мне знать, если есть лучший способ сделать, чем этот запрос.

select TO_CHAR(TRUNC(SYSDATE,'MM')-1,'YYYYMMDD')-(level-1) as 
EACH_DATE from dual A connect by level 
< (TO_NUMBER(TO_CHAR(TRUNC(SYSDATE,'MM')-1,'DD'))+1)

Также, пожалуйста, сообщите мне о проблеме с этим запросом, который говорит "отсутствует правая скобка"

SELECT /*+ PARALLEL (A,8) */ /*+ DRIVING_STATE */
   TO_CHAR(TRUNC(TRUNC(SYSDATE,'MM')-1,'MM'),'MONYYYY') "MONTH", TYPE AS "TRAFF",     COLUMN, A_COUN AS "A_COUNT",COST  FROM DATA_P B WHERE  EXISTS  
(  
  select TO_NUMBER(TO_CHAR(TRUNC(SYSDATE,'MM')-1,'YYYYMMDD')-(level-1))  EACH_DATE 
  from dual A connect by  level < TO_NUMBER(TO_CHAR(TRUNC(SYSDATE,'MM')-1,'DD')+1) 
  WHERE A.EACH_DATE = B.DATE  order by EACH_DATE ASC
 )

выделенный текст


person Dead Programmer    schedule 10.01.2011    source источник


Ответы (5)


Похоже, вы хотите что-то вроде этого

SQL> ed
Wrote file afiedt.buf

  1  select to_char( add_months(trunc(sysdate,'MM'),-1) + level - 1,
  2                  'YYYYMMDD' )
  3    from dual
  4  connect by level <=
  5    last_day(add_months(trunc(sysdate,'MM'),-1)) -
  6    add_months(trunc(sysdate,'MM'),-1) +
  7*   1
SQL> /

TO_CHAR(
--------
20101201
20101202
20101203
20101204
20101205
20101206
20101207
20101208
20101209
20101210
20101211
20101212
20101213
20101214
20101215
20101216
20101217
20101218
20101219
20101220
20101221
20101222
20101223
20101224
20101225
20101226
20101227
20101228
20101229
20101230
20101231

31 rows selected.
person Justin Cave    schedule 10.01.2011

за текущий месяц:

SELECT  TO_CHAR (TRUNC (SYSDATE, 'MM'), 'YYYYMMDD')+(LEVEL - 1) each_date
FROM    DUAL a
CONNECT BY LEVEL < (TO_NUMBER (TO_CHAR (TRUNC (SYSDATE, 'MM') - 1, 'DD'))+1)
person M Naveed Raza    schedule 15.11.2012

Немного add_months определенно улучшит ситуацию, как, например.

select to_char(x,'yyyymmdd') from (
  select add_months(trunc(sysdate,'MONTH'),-1)+rownum-1 x from all_objects
) where x<trunc(sysdate,'MONTH');
person Erich Kitzmueller    schedule 10.01.2011
comment
ваш запрос занимает 17 секунд в prod env. также, если бы вы посоветовали ошибку скобок. - person Dead Programmer; 10.01.2011
comment
хм ... вы можете заменить all_objects чем-то другим, в идеале таблицей с 31 записью - person Erich Kitzmueller; 10.01.2011
comment
об ошибке... COLUMN - ключевое слово, попробуйте вместо него "COLUMN"; то же самое с "TYPE" - person Erich Kitzmueller; 10.01.2011


Что касается правильной скобки, вы пытаетесь объединить строки неправильным образом:

select TO_CHAR(TRUNC(SYSDATE,'MM')-1,'YYYYMMDD')-(level-1) as

должно сработать:

select TO_CHAR(TRUNC(SYSDATE,'MM')-1,'YYYYMMDD') || '-' || To_Char(level-1) as

Очевидно, вы не хотите, чтобы конкатенация произошла. Поэтому я думаю, что вы на самом деле хотите добавить уровень в TRUNC() часть

Исправить:

select TO_CHAR(TRUNC(SYSDATE,'MM') - 1 + level - 1,'YYYYMMDD') as 
EACH_DATE from dual A connect by level 
< (TO_NUMBER(TO_CHAR(TRUNC(SYSDATE,'MM')-1,'DD'))+1)
person sjngm    schedule 10.01.2011