2010-11-26 89 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');