首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从日期提取月份和年份的甲骨文ORA-01722:非安定

从日期提取月份和年份的甲骨文ORA-01722:非安定
EN

Stack Overflow用户
提问于 2018-10-17 09:25:32
回答 2查看 279关注 0票数 0

因此,我试图从一个日期提取月份和年份: 01/07/2018将返回“7月-18日”

我正在尝试这个简单的查询来尝试提取

代码语言:javascript
复制
select TO_CHAR('01/10/2008','MON-YY') from dual

但是它返回以下异常

ORA-01722:非安定性

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-17 09:29:57

'01/10/2008'是一个字符串,而不是日期。有四个to_char()函数采用不同的参数类型,而且(大概是因为隐式转换优先级),您实际上是在调用to_char(number),而不是您想要的(date)版本。

这意味着您正在有效地执行TO_CHAR(TO_NUMBER('01/10/2008'), 'MON-YY'),而抛出ORA-01722的是隐式TO_NUMBER('01/10/2008')

如果以该字符串开始,并且试图有效地更改格式,则需要先显式转换为日期,然后将其转换回字符串:

代码语言:javascript
复制
select TO_CHAR(TO_DATE('01/10/2008', 'DD/MM/YYYY'), 'MON-YY') from dual;

TO_CHA
------
OCT-08

由于月份名称和缩写依赖于NLS设置,因此您可能希望重写会话设置以获得一致的结果:

代码语言:javascript
复制
alter session set NLS_DATE_LANGUAGE='FRENCH';

select TO_CHAR(TO_DATE('01/07/2018', 'DD/MM/YYYY'), 'MON-YY') from dual;

TO_CHAR(
--------
JUIL.-18

select TO_CHAR(TO_DATE('01/07/2018', 'DD/MM/YYYY'), 'MON-YY',
  'NLS_DATE_LANGUAGE=ENGLISH') from dual;

TO_CHA
------
JUL-18
票数 1
EN

Stack Overflow用户

发布于 2018-10-17 09:29:49

这里需要两步。首先,使用TO_DATE将文本日期转换为真正的日期,然后调用TO_CHAR将其格式化为您想要的方式:

代码语言:javascript
复制
SELECT TO_CHAR(TO_DATE('01/10/2008', 'DD/MM/YYYY'), 'MON-YY')
FROM dual;

OCT-08

演示

注意:如果可能的话,最好只使用有效的Oracle日期文本。例如,以下查询避免了对TO_DATE的调用

代码语言:javascript
复制
SELECT TO_CHAR(DATE '2008-10-01', 'MON-YY')
FROM dual;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52851473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档