繁体   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