我想使用CAST
将DATE
类型转换为VARCHAR2
类型。
DBUSER >SELECT CAST(CURRENT_DATE AS VARCHAR2(20)) THE_DATE from DUAL;
THE_DATE
--------------------
09-AUG-17
然而,我需要VARCHAR2结果被格式化为'YYYYMM'。我知道我可以通过改变会话日期格式来实现这种效果,但我宁愿不这样做。
DBUSER >ALTER SESSION SET NLS_DATE_FORMAT = 'YYYYMM';
Session altered.
DBUSER >SELECT CAST(CURRENT_DATE AS VARCHAR2(20)) THE_DATE from DUAL;
THE_DATE
--------------------
201708
我想避免使用Oracle专有的TO_CHAR()函数。有人能给我一个建议吗?
2条答案
按热度按时间zsbz8rwp1#
我正试图尽可能地标准化ANSI SQL,并避免专有的供应商非标准实现。
ANSI SQL92 standard中没有指定将
DATETIME
数据类型格式化为字符串的函数。最简单的解决方案是使用Oracle为此提供的函数:
但是,您可以使用
EXTRACT
函数(在ANSI标准中)获得年和月组件:然后你需要将数字转换为字符串并连接字符串:
但是你试图避免
TO_CHAR
,所以你可以这样做:或者,使用隐式强制转换
但是,如果年份不是4位数或月份不是2位数,则需要填充这些值;同样,简单的解决方案是
TO_CHAR
:或
LPAD
:但是这两个都不在
ANSI
标准中,所以:我们已经成功地将单个Oracle函数转换为ANSI兼容表达式的庞然大物。
但是,Oracle的
DATE
数据类型不符合ANSI标准(它是ANSIDATE
和TIME
数据类型的组合),所以我会问这样做是否值得-特别是如果您考虑显示日期的时间部分(除非您首先使用CAST
将DATE
转换为TIMESTAMP
,否则EXTRACT
不会提取该值)。或
**[TL/DR]**使用
TO_CHAR
即可pxiryf3j2#
这可能会帮助你: