问题描述:在用informatica抽取ORACLE数据库表字符串类型“23-JUN-99”格式时间时,对字符串进行日期类型转换时,格式化字符串用TO_CHAR(to_date(’23-JUN-99′,’dd-MON-YY’,),’YYYYMMDD’),提示“无效的月份”。
对于字符串类型“23-JUN-99”格式时间转换成“YYYYMMDD”格式,我们首先要了解一下日期格式字符的具体含义,请看下表:
代码 | 代表的格式 | 例子 |
AM、PM | 上午、下午 | 08 AM |
D | 数字表示的星期(1~7) | 1, 2, 3, …, 7 |
DD | 数字表示月中的日期(1~31) | 1, 2, 3, …, 31 |
MM | 两位数的月份 | 01, 02, …, 12 |
Y、YY、YYY、YYYY | 年份的后几位 | 8, 08, 008, 2008 |
RR | 解决Y2K问题的年度转换 | |
DY | 简写的星期名 | MON, TUE, FRI, … |
DAY | 全拼的星期名 | MONDAY, TUESDAY, … |
MON | 简写的月份名 | JAN, FEB, MAR, … |
MONTH | 全拼的月份名 | JANUARY, FEBRUARY, … |
HH、HH12 | 12小时制的小时(1~12) | 1, 2, 3, …, 12 |
HH24 | 24小时制的小时(0~23) | 0, 1, 2, …, 23 |
MI | 分(0~59) | 0, 1, 2, …, 59 |
SS | 秒(0~59) | 0, 1, 2, …, 59 |
, . / – ; : | 原样显示的标点符号 | |
‘TEXT’ | 引号中的文本原样显示 | TEXT |
通过上表,那么我们本例中的字符串时间格式就是“DD-MON-YY”,我们只需要通过to_date函数就能轻松得出转换函数应该这样写:TO_CHAR(to_date(’23-JUN-99′,’dd-MON-YY’,),’YYYYMMDD’),至于为何出现提示“无效年月”的错误,主要还是因为NLS_DATE_LANGUAGE值的问题,这是由于不同系统时间格式不同导致的,现在的客户端大部分都是使用的中文环境,“JUN”的格式是无法识别的,所以需要在后面添加NLS_DATE_LANGUAGE参数强制规定语言类型,在这个例子里面我们加上“NLS_DATE_LANGUAGE=AMERICAN”进行时间格式转换就可以了。
下面介绍一下不同系统中时间转换NLS_DATE_LANGUAGE的用法:
英文:NLS_DATE_LANGUAGE=AMERICAN
日文:NLS_DATE_LANGUAGE = Japanese
中文:NLS_DATE_LANGUAGE = SIMPLIFIED CHINESE
总结解决方法:使用select TO_CHAR(to_date(’23-JUN-99′,’dd-MON-YY’,’NLS_DATE_LANGUAGE=AMERICAN’),’YYYY-MM-DD’) from dual;搞定。
silenkee 2015/11/25 10:14
评论写得diao的孩纸,人生更diao 😎