[英]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.