oracle 使用dow函数的标识符无效

lmvvr0a8  于 2022-12-03  发布在  Oracle
关注(0)|答案(1)|浏览(141)

我在尝试显示first_day和last_day的dow()时得到了无效的标识符。
谁能帮帮我。

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

CREATE OR REPLACE FUNCTION dow(P_DAY DATE) RETURN VARCHAR2
IS
BEGIN
    RETURN(TO_CHAR(P_DAY,'DAY'));
END;
/

 with starting_date (datum) as
      (select add_months(trunc(sysdate, 'yyyy'), 12) from dual)
    select          add_months(datum, level - 1)  first_day,
           dow(first_day),
          last_day(add_months(datum, level - 1)) as last_day,
            dow(last_day)
    from starting_date
    connect by level <= 12;
jk9hmnmh

jk9hmnmh1#

不能在定义列别名的同一查询级别中使用列别名(order-by子句除外)。您需要使用另一个子查询获取first_daylast_day值,然后在外部查询中调用dow(),或者只是重复计算:

with starting_date (datum) as (
  select add_months(trunc(sysdate, 'yyyy'), 12) from dual
)
select
  add_months(datum, level - 1) as first_day,
  dow(add_months(datum, level - 1)) as first_dow,
  last_day(add_months(datum, level - 1)) as last_day,
  dow(last_day(add_months(datum, level - 1))) as last_dow
from starting_date
connect by level <= 12;

| 第一天|第一个_DOW|最后一天|最后_向下|
| - -|- -|- -|- -|
| 2023年1月1日|星期日|2023年1月31日|星期二|
| 2023年2月1日|星期三|2023年2月28日|星期二|
| 2023年3月1日|星期三|2023年3月31日|星期五|
| 2023年4月1日|星期六|2023年4月30日|星期日|
| 2023年5月1日|星期一|2023年5月31日|星期三|
| 2023年6月1日|星期四|2023年6月30日|星期五|
| 2023年7月1日|星期六|2023年7月31日|星期一|
| 2023年8月1日|星期二|2023年8月31日|星期四|
| 2023年9月1日|星期五|2023年9月30日|星期六|
| 2023年10月1日|星期日|2023年10月31日|星期二|
| 2023年11月1日|星期三|2023年11月30日|星期四|
| 2023年12月1日|星期五|2023年12月31日|星期日|
fiddle
使用函数名或其他关键字作为对象名(包括别名)通常也不是一个好主意;这不是抱怨,但我还是考虑将该列命名为last_day以外的其他名称。
您还应该注意,将日期转换为日名称(以及其他格式)会受到会话NLS设置的影响,因此运行此操作的其他人可能会看到不同语言的名称。默认情况下,日名称会用空格填充,这可能是您所不希望的。

相关问题