4

みんな私は以下のように前月のすべての日付をリストする必要があります

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
 )

強調されたテキスト

4

5 に答える 5

7

このようなものが欲しいようです

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.
于 2011-01-10T08:51:10.147 に答える
3

今月の場合:

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)
于 2012-11-15T05:16:19.577 に答える
1

たとえば、 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');
于 2011-01-10T08:31:39.260 に答える
1

これは少し理解しやすいかもしれません:

select TO_CHAR(d, 'YYYYMMDD')
from (
  select ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -1) + (ROWNUM - 1) d
  from DUAL connect by level <= 31
)
where d < TRUNC(SYSDATE, 'MM')

ただし、「レベルで接続」方法が最も明確であり、ここで説明されているように、数列を生成するより高速な方法です。クエリを劇的に改善する方法はないと思います。

于 2011-01-10T09:23:44.367 に答える
0

右括弧に関する限り、文字列を間違った方法で連結しようとしています:

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)
于 2011-01-10T08:58:44.947 に答える