Pregunta

Hasta ahora tengo el siguiente:

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"

Sin embargo, esto me da un error:

  

ORA-00904: "current_month": inválido identificador

Sin embargo, sin la cláusula WHERE, que trabaja muy bien. Algunas ideas?

¿Fue útil?

Solución

Desafortunadamente no puede hacer referencia a los alias de columna en la cláusula WHERE, ya que no están aún disponibles. Usted puede hacer ya sea esto:

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

o hacer esto:

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"

Otros consejos

la cláusula SELECT se evalúa después de la cláusula WHERE de SQL. Esta es la razón por la cláusula WHERE no puede ver los alias que haya definido.

O bien:

  • ejecutar una sub consulta:

    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"
    
  • o utilizar la expresión en la cláusula 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
    

Me quedaría lejos de la realización de arithmtic en el valor de retorno de TO_CHAR. Cuando restando 1 de la cadena '01' (de Enero) no vamos a terminar con 12 (diciembre).

Usted debe hacer algo como esto:

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

Ahora la consulta puede utilizar un índice en depart_date. Y TO_CHAR no tiene que ser llamado para cada fila.

Si desea comparar fechas, no debe convertirlos en cadenas -. Oracle tiene incorporado soporte para la fecha / hora aritmética

En su caso, parece que está consultando la tabla, donde el mes de la fecha de salida es igual al mes anterior - que no tiene sentido. Si se trata actualmente de noviembre continuación, la consulta sería devuelve filas de octubre de 2010, octubre de 2009, octubre de 2008, etc. ¿Estas seguro que es lo que quería?

Una de las mejores maneras de utilizar la aritmética de fechas para determinar si una fecha se encuentra dentro del mes anterior es el uso de una combinación de TRUNCAR (fecha, 'MES'), que devuelve el primer día del mes en curso, con ADD_MONTHS ( fecha, -1), que obtiene la fecha un mes antes.

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;

El "0,00001" resta un segundo desde la fecha, por lo que el rango de fechas se convierte efectivamente (suponiendo que es ahora noviembre de 2010) 01-Oct-2010 00:00:00 al 31-Oct-2010 23:59:59.

Una alternativa, la sintaxis equivalente sería:

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');
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top