Question

Jusqu'à présent, j'ai les éléments suivants:

SELECT TO_CHAR("HOL_DEPART_DATES"."DEPART_DATE", 'MM') as "Depart_Month",
       TO_CHAR(sysdate, 'mm')-1 as "Current_Month"
  FROM "HOL_DEPART_DATES" "HOL_DEPART_DATES"
 WHERE "Depart_Month" = "Current_Month"

Cependant, cela me donne une erreur:

  

ORA-00904: "current_month": invalide identifiant

Toutefois, sans la clause WHERE, il fonctionne très bien. Toutes les idées?

Était-ce utile?

La solution

Malheureusement, vous ne pouvez pas référencer les alias de colonne dans la clause WHERE car ils ne sont pas encore disponibles. Vous pouvez faire ceci:

select  TO_CHAR("HOL_DEPART_DATES"."DEPART_DATE", 'MM') as "Depart_Month",
          TO_CHAR(sysdate, 'mm')-1 as "Current_Month"
from     "HOL_DEPART_DATES" "HOL_DEPART_DATES"
where     TO_CHAR("HOL_DEPART_DATES"."DEPART_DATE", 'MM') = TO_CHAR(sysdate, 'mm')-1

ou faire ceci:

select "Depart_Month", "Current_Month"
from
( select  TO_CHAR("HOL_DEPART_DATES"."DEPART_DATE", 'MM') as "Depart_Month",
          TO_CHAR(sysdate, 'mm')-1 as "Current_Month"
  from     "HOL_DEPART_DATES" "HOL_DEPART_DATES"
)
where     "Depart_Month" = "Current_Month"

Autres conseils

la clause SELECT est évaluée après la clause WHERE dans SQL. Voilà pourquoi la clause WHERE ne peut pas voir les alias que vous avez définis.

Soit:

  • exécuter une sous-requête:

    SELECT "Depart_Month", "Current_Month"
      FROM (SELECT TO_CHAR("HOL_DEPART_DATES"."DEPART_DATE", 'MM')
                      AS "Depart_Month",
                   TO_CHAR(SYSDATE, 'mm') - 1 AS "Current_Month"
              FROM "HOL_DEPART_DATES" "HOL_DEPART_DATES")
     WHERE "Depart_Month" = "Current_Month"
    
  • ou l'expression dans la clause where:

    SELECT TO_CHAR("HOL_DEPART_DATES"."DEPART_DATE", 'MM') AS "Depart_Month", 
           TO_CHAR(SYSDATE, 'mm') - 1 AS "Current_Month"
      FROM "HOL_DEPART_DATES" "HOL_DEPART_DATES"
     WHERE TO_CHAR("HOL_DEPART_DATES"."DEPART_DATE", 'MM') 
            = TO_CHAR(SYSDATE, 'mm') - 1
    

Je resterais loin de réaliser arithmtic sur la valeur de retour de TO_CHAR. Lorsque soustrayant 1 de la chaîne '01' (januari), nous ne finirons pas avec 12 (décembre).

Vous devriez faire quelque chose comme ceci:

select *
  from hol_depart_dates
 where depart_date between trunc(add_months(sysdate, -1), 'MM')
                       and trunc(sysdate, 'MM') - interval '1' second;

Maintenant, la requête peut utiliser un index sur depart_date. Et TO_CHAR ne doit pas être appelé pour chaque ligne.

Si vous voulez comparer les dates, vous ne devriez pas les convertir en chaînes -. Oracle a intégré le soutien pour l'arithmétique de date / heure

Dans votre cas, il semble que vous vous interrogez la table où le mois de la date de départ est égal au mois précédent - qui n'a pas de sens. Si elle est actuellement Novembre, la requête retournerait les lignes d'Octobre 2010, Octobre 2009, Octobre 2008, etc. Etes-vous sûr de ce que vous vouliez?

L'une des meilleures façons d'utiliser l'arithmétique de date pour déterminer si une date est au cours du mois précédent est d'utiliser une combinaison de TRUNC (date, « mois »), qui renvoie le premier jour du mois en cours, avec ADD_MONTHS ( ce jour, -1), qui obtient la date un mois avant.

SELECT  TO_CHAR("HOL_DEPART_DATES"."DEPART_DATE", 'MM') as "Depart_Month",
        TO_CHAR(ADD_MONTHS(sysdate, -1), 'mm') as "Current_Month"
FROM    "HOL_DEPART_DATES"
WHERE   "HOL_DEPART_DATES"."DEPART_DATE"
        BETWEEN ADD_MONTHS(TRUNC(SYSDATE,'MONTH'),-1)
        AND     TRUNC(SYSDATE,'MONTH') - 0.00001;

Le « 0,00001 » soustraient une seconde du jour, de sorte que la plage de dates devient effective (en supposant qu'il est maintenant Novembre 2010) 01-Oct-2010 au 31-00:00:00 Oct-2010 est 23:59:59.

Une syntaxe alternative équivalente serait:

SELECT  TO_CHAR("HOL_DEPART_DATES"."DEPART_DATE", 'MM') as "Depart_Month",
        TO_CHAR(ADD_MONTHS(sysdate, -1), 'mm') as "Current_Month"
FROM    "HOL_DEPART_DATES"
WHERE   "HOL_DEPART_DATES"."DEPART_DATE"
        >= ADD_MONTHS(TRUNC(SYSDATE,'MONTH'),-1)
AND     "HOL_DEPART_DATES"."DEPART_DATE" < TRUNC(SYSDATE,'MONTH');
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top