2010-11-26 56 views
1

到目前为止,我有以下几点:的Oracle SQL上个月查询问题

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": invalid identifier

但是没有WHERE子句,它工作正常。有任何想法吗?

回答

2

不幸的是,你不能引用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 

或做到这一点:在SQL WHERE子句后

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" 
+0

点上,你们俩,更有道理吧! – Coffeee 2010-11-26 16:54:20

2

SELECT子句进行评估。这就是为什么WHERE子句不能看到你定义的别名。

或者:

  • 运行子查询:

    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 
    
1

我将从执行远离对返回值fr算术om 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; 

现在查询可以在depart_date使用索引。 TO_CHAR不必为每一行调用。

+0

由于您从TRUNC(SYSDATE,'MM')中减去了一整天,因此您有效地错过了本月最后一天的任何出发日期(除非他们的时间恰好是午夜12点)。 – 2010-11-27 05:27:22

0

如果你想比较日期,你不应该将它们转换为字符串 - Oracle内置支持日期/时间算术。

就你而言,你似乎在查询出发日期的月份与前一个月相等的表格 - 这是没有意义的。如果目前是11月,那么查询将返回2010年10月,2009年10月,2008年10月等行。你确定这是你想要的吗?

使用日期算法确定日期是否在上个月内的最佳方法之一是使用返回当前月份第一天的TRUNC(date,'MONTH')和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” 减去1秒从日期,所以时间范围有效地变成(假设它现在是2010年11月)01-OCT-2010 00:00:00到31-OCT-2010 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');