题
到目前为止,我有以下内容:
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"
但是,这给了我一个错误:
ORA-00904:“ Current_Month”:无效标识符
但是,没有哪个子句,它可以正常工作。有任何想法吗?
解决方案
不幸的是,您无法在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
或这样做:
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"
其他提示
SQL中的WHERE子句之后评估SELECT子句。这就是为什么子句看不到您定义的别名的原因。
任何一个:
运行子查询:
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"
或在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
我会远离从to_char的返回值执行算术。从字符串“ 01”(Januari)中减1时,我们不会最终获得12(12月)。
您应该做这样的事情:
select *
from hol_depart_dates
where depart_date between trunc(add_months(sysdate, -1), 'MM')
and trunc(sysdate, 'MM') - interval '1' second;
现在查询可以在dectiber_date上使用索引。并且不必为每行调用to_char。
如果要比较日期,则不应将它们转换为字符串 - Oracle对日期/时间算术的内置支持。
就您而言,似乎您正在查询出发日期的月份等于前一个月的表格 - 这是没有意义的。如果目前是11月,那么查询将从2010年10月,2009年10月,2008年10月等返回行,您确定这是您想要的吗?
使用日期算术来确定日期是否在上个月之内的最佳方法之一是使用trunc(日期,'月份)的组合,该组合返回了本月的第一天,带有add_months(日期, - 1),一个月前的日期。
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;
“ 0.00001”从日期开始减去一秒钟,因此日期范围有效地变为(假设现在是2010年11月)2010年1月1日至2010年至2010年3月31日23:59:59。
另一种等效的语法是:
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');
不隶属于 StackOverflow