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?
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))
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
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');
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.
Récupération des données des n derniers mois
SELECT * FROM TABLE_NAME
WHERE DATE_COLUMN BETWEEN '&STARTDATE' AND '&ENDDATE';