簡體   English   中英

Oracle SQL上個月查詢問題

[英]Oracle SQL Previous Month query issue

到目前為止,我有以下幾點:

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子句,它就可以正常工作。 有任何想法嗎?

不幸的是,您無法在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"

SELECT子句在SQL中的WHERE子句之后進行求值。 這就是為什么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 

我會避免對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。

如果要比較日期,則不應將它們轉換為字符串-Oracle內置了對日期/時間算術的支持。

在您的情況下,您似乎在查詢離港日期的月份等於上個月的月份的表-這沒有任何意義。 如果當前是11月,則查詢將返回2010年10月,2009年10月,2008年10月等的行。確定要這樣做嗎?

使用日期算術確定日期是否在上個月之內的最佳方法之一是結合使用TRUNC(date,'MONTH')和ADD_MONTHS(date,- 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年10月1日00:00:00至2010年10月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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM