Oracle SQL mes anterior edición consulta
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?
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');