ORA-01843: 不是具有有效 SQL 查询的有效月份
Posted
技术标签:
【中文标题】ORA-01843: 不是具有有效 SQL 查询的有效月份【英文标题】:ORA-01843: not a valid month with valid SQL query 【发布时间】:2018-04-26 07:50:01 【问题描述】:我正在尝试获取 current date
、week number
、first date in the week
和 last date in the week
。它下面的 SQL 语句正在运行,但是当我在 Oracle Apex 中运行时,我得到 ORA-01843: not a valid month
declare
date_value char;
week_value pls_integer;
start_date_value char;
end_date_value char;
begin
SELECT
TO_CHAR(TRUNC(TO_DATE(CURRENT_DATE,'MM/DD/YYYY')),'DD.MM.YYYY')
, TO_NUMBER(TO_CHAR(TO_DATE(CURRENT_DATE,'MM/DD/YYYY'),'WW'))
, TO_CHAR(TRUNC(TO_DATE(CURRENT_DATE,'MM/DD/YYYY'), 'IW'),'DD.MM.YYYY')
, TO_CHAR(NEXT_DAY(TRUNC(TO_DATE(CURRENT_DATE,'MM/DD/YYYY'),'IW'),'SUNDAY'),'DD.MM.YYYY')
INTO
date_value
, week_value
, start_date_value
, end_date_value
FROM DUAL;
htp.p('<< '||'Week'|| week_value ||' >> '|| start_date_value ||' - '|| end_date_value);
end;
还尝试使用 sysdate 并且仅在 SQL 中有效,但在 PL/SQL (Oracle Apex) 页面中会引发相同的异常。 提前致谢。
【问题讨论】:
如果 CURRENT_DATE 是当前日期,并且是日期数据类型,为什么要通过 TO_DATE 函数运行它?上面有固定格式的图片,这将导致基于格式图片的 NLS 设置的隐式日期到字符串转换,这可能与转换回来的格式图片不匹配。 谢谢@Andrew。 ORACLE - ORA-01843: not a valid month的可能重复 【参考方案1】:您使用DATE
(不是字符串)调用TO_DATE( date_string, format_model )
,这会导致Oracle 使用NLS_DATE_FORMAT
会话参数作为格式模型将DATE
隐式转换为VARCHAR2
您可以将其转换回DATE
。
所以查询:
TO_DATE(CURRENT_DATE,'MM/DD/YYYY')
有效:
TO_DATE(
TO_CHAR(
CURRENT_DATE,
( SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT' )
),
'MM/DD/YYYY'
)
如果 NLS_DATE_FORMAT
与 MM/DD/YYYY
匹配,那么您的查询将起作用 - 格式不匹配因此不起作用。
您应该做的不是在 DATE
数据类型上使用 TO_DATE
- 它已经是 DATE
所以您不需要。
declare
date_value char(10) := TO_CHAR( CURRENT_DATE, 'DD.MM.YYYY' );
week_value pls_integer := TO_NUMBER(TO_CHAR(CURRENT_DATE,'WW'));
start_date_value char(10) := TO_CHAR(TRUNC(CURRENT_DATE, 'IW'),'DD.MM.YYYY');
end_date_value char(10) := TO_CHAR(NEXT_DAY(TRUNC(CURRENT_DATE,'IW'),'SUNDAY'),'DD.MM.YYYY');
begin
htp.p('<< '||'Week'|| week_value ||' >> '|| start_date_value ||' - '|| end_date_value);
end;
【讨论】:
非常感谢。我没有这样想,但它更简单。以上是关于ORA-01843: 不是具有有效 SQL 查询的有效月份的主要内容,如果未能解决你的问题,请参考以下文章
ORA-01843 - 不是有效的月份 oracle SQL