到目前为止,我有以下内容:

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');
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top