web-dev-qa-db-fra.com

Fonction de date Oracle pour le mois précédent

J'ai la requête ci-dessous où la date est codée en dur. Mon objectif est de supprimer la date codifiée. la requête doit extraire les données du mois précédent lorsqu’elle s’exécute.

select count(distinct switch_id)
  from [email protected]
 where dealer_name =  'XXXX'
   and TRUNC(CREATION_DATE) BETWEEN '01-AUG-2012' AND '31-AUG-2012'

Devrais-je utiliser la fonction sysdate-15 pour cela?

13
user803860

Modification de la requête de Ben un peu,

 select count(distinct switch_id)   
  from [email protected]  
 where dealer_name =  'XXXX'    
   and creation_date between add_months(trunc(sysdate,'mm'),-1) and last_day(add_months(trunc(sysdate,'mm'),-1))
41

La fonction trunc() tronque une date à la période spécifiée; alors trunc(sysdate,'mm') renverrait le début du mois en cours. Vous pouvez ensuite utiliser la fonction add_months() pour obtenir le début du mois précédent, quelque chose comme ceci:

select count(distinct switch_id)   
  from [email protected]  
 where dealer_name =  'XXXX'    
   and creation_date >= add_months(trunc(sysdate,'mm'),-1) 
   and creation_date < trunc(sysdate, 'mm')

En tant que petit côté, vous n'êtes pas explicitement en train de convertir une date dans votre requête initiale. Toujours le faire, en utilisant un date littéral , par ex. DATE 2012-08-31 ou la fonction to_date() , par exemple to_date('2012-08-31','YYYY-MM-DD'). Si vous ne le faites pas, vous vous tromperez sûrement à un moment donné.

Vous n'utiliseriez pas sysdate - 15 car cela indiquerait la date 15 jours avant la date actuelle, ce qui ne semble pas être ce que vous recherchez. Cela inclurait également une composante temporelle puisque vous n'utilisez pas trunc().


Juste comme une petite démonstration de ce que trunc(<date>,'mm') fait:

select sysdate
     , case when trunc(sysdate,'mm') > to_date('20120901 00:00:00','yyyymmdd hh24:mi:ss')
             then 1 end as gt
     , case when trunc(sysdate,'mm') < to_date('20120901 00:00:00','yyyymmdd hh24:mi:ss')
             then 1 end as lt
     , case when trunc(sysdate,'mm') = to_date('20120901 00:00:00','yyyymmdd hh24:mi:ss')
             then 1 end as eq
  from dual
       ;

SYSDATE                   GT         LT         EQ
----------------- ---------- ---------- ----------
20120911 19:58:51                                1
10
Ben

Données pour le mois dernier

select count(distinct switch_id)
  from [email protected]
 where dealer_name =  'XXXX'
   and to_char(CREATION_DATE,'MMYYYY') = to_char(add_months(trunc(sysdate),-1),'MMYYYY');
3
Annjawn

Je crois que cela fonctionnerait aussi:

select count(distinct switch_id)   
  from [email protected]  
 where 
   dealer_name =  'XXXX'    
   and (creation_date BETWEEN add_months(trunc(sysdate,'mm'),-1) and  trunc(sysdate, 'mm'))

Il a l’avantage d’utiliserENTRE, ce qui correspond à la façon dont le PO a utilisé ses critères de sélection de date.

1
kiltannen

Récupération des données des n derniers mois

SELECT * FROM TABLE_NAME 
WHERE DATE_COLUMN BETWEEN '&STARTDATE' AND '&ENDDATE'; 
0
user6789985