我在尝试显示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;
1条答案
按热度按时间jk9hmnmh1#
不能在定义列别名的同一查询级别中使用列别名(order-by子句除外)。您需要使用另一个子查询获取
first_day
和last_day
值,然后在外部查询中调用dow()
,或者只是重复计算:| 第一天|第一个_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设置的影响,因此运行此操作的其他人可能会看到不同语言的名称。默认情况下,日名称会用空格填充,这可能是您所不希望的。