如何从Oracle中的日期中提取月份号

And*_*rew -2 sql oracle select date

我有一个ID_BB_SECURITY列,例如,日期值存储在此列中'20190801'

我想从此字段中获取月份号,例如我想获得8月的日期。

我在下面的查询中尝试过,但抛出了“字面不匹配”错误:

select to_number(to_date(ID_BB_SECURITY),'mm') from BT_EXPORT
Run Code Online (Sandbox Code Playgroud)

我不确定是否必须忽略null值以避免错误

Ale*_*ole 6

如果值是数字或字符串,则可以将其转换为带有适当掩码的日期-这是您所缺少的,也是导致您收到错误的原因(因为它使用的是会话NLS_DATE_FORMAT设置,这显然不匹配)数据的格式;但是无论如何您都不应该依赖它,如@MTO在评论中所说):

to_date(ID_BB_SECURITY, 'YYYYMMDD')
Run Code Online (Sandbox Code Playgroud)

然后从中提取月份号

select extract(month from to_date(ID_BB_SECURITY, 'YYYYMMDD')) from BT_EXPORT
Run Code Online (Sandbox Code Playgroud)

或者,您可以只使用一个子字符串:

select to_number(substr(ID_BB_SECURITY, 5, 2)) from BT_EXPORT;
Run Code Online (Sandbox Code Playgroud)

这些假设采用固定的一致格式,当使用错误的数据类型时,这总是有风险的假设。如果是数字,则表示它们正在从数字到字符串进行隐式转换,您可以将其转换为显式转换以更清楚。

如果已经是日期(当然应该是日期),那么您不需要转换:

select extract(month from ID_BB_SECURITY) from BT_EXPORT
Run Code Online (Sandbox Code Playgroud)


Gor*_*off 5

如果您有数字,则可以使用算术来提取月份:

select mod(floor(20190801 / 100), 100)
from dual;
Run Code Online (Sandbox Code Playgroud)

  • 因不依赖丑陋的字符串操作而成为唯一的答案而被赞誉。 (3认同)