开发者

oracle sql query to list all the dates of previous month

开发者 https://www.devze.com 2023-02-04 09:54 出处:网络
Guysi have a requirement to list all the dates of the previous monthlike below 20101201 20101202 20101203

Guys i have a requirement to list all the dates of the previous month like below

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

kindly let me know if any better way to do than this query.

select TO_CHAR(TRUNC(SYSDATE,'MM')-1,'YYYYMMDD')-(level-1) as 
EACH_DATE from dual A connec开发者_运维百科t by level 
< (TO_NUMBER(TO_CHAR(TRUNC(SYSDATE,'MM')-1,'DD'))+1)

Also please let me know the problem with this query it says "missing right parenthesis"

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
 )

emphasized text


It sounds like you want something like this

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.


for current month :

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)


A bit of add_months would definitely make it better, as in e.g.

select to_char(x,'yyyymmdd') from (
  select add_months(trunc(sysdate,'MONTH'),-1)+rownum-1 x from all_objects
) where x<trunc(sysdate,'MONTH');


This may be a little easier to understand:

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')

However, the "connect by level" method is the most clear, and as described here, faster way to generate sequence of numbers. I don't think there is no way to dramatically improve your query.


As far as the right parenthesis is concerned, you are trying to concatenate strings the wrong way:

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

should work:

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

Obviously you don't want the concatenation to happen. Therefore, I think you actually want to add the level to the TRUNC()-part

Fix:

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)
0

精彩评论

暂无评论...
验证码 换一张
取 消