繁体   English   中英

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

[英]How to extract month number from date in Oracle

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

我想从这个字段中获取月份数,例如我想得到 8 的八月日期。

我试过下面的查询,但它抛出一个错误“文字不匹配”:

select to_number(to_date(ID_BB_SECURITY),'mm') from BT_EXPORT

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

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

to_date(ID_BB_SECURITY, 'YYYYMMDD')

然后从中提取月份数

select extract(month from to_date(ID_BB_SECURITY, 'YYYYMMDD')) from BT_EXPORT

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

select to_number(substr(ID_BB_SECURITY, 5, 2)) from BT_EXPORT;

那些假设是固定的一致格式,当使用错误的数据类型时,这总是一个冒险的假设。 Ans 如果它是一个数字,他们正在进行从数字到字符串的隐式转换,为了更清晰,您可以将其转换为显式转换。

如果它已经是一个日期 - 当然应该是 - 那么你不需要转换:

select extract(month from ID_BB_SECURITY) from BT_EXPORT

如果你有一个数字,你可以使用算术来提取月份:

select mod(floor(20190801 / 100), 100)
from dual;

您可以尝试将数字日期转换为字符串,然后提取第 5 个和第 6 个字符:

SELECT
    SUBSTR(TO_CHAR(ID_BB_SECURITY), 5, 2) AS mm
FROM BT_EXPORT;

但是,使用适当的日期列对您来说会好得多。 然后,您可以使用不那么严厉的方法,例如:

SELECT
    TO_CHAR(ID_BB_SECURITY, 'mm') AS mm  -- assuming date
FROM BT_EXPORT;
select to_number(to_char(to_date('20190801', 'yyyymmdd'), 'mm')) from dual

select extract(month from to_date('20190801', 'yyyymmdd')) from dual

试试这个

select extract(month from to_date(ID_BB_SECURITY, 'YYYYMMDD')) from BT_EXPORT

这一个将数字转换为日期然后提取月份。

您的日期列的值以以下格式“yyyymmdd”存储,其中

  • yyyy 是年份
  • mm 月份
  • dd the day 所以为了返回月份的数值(mm)我们可以这样做:

    1:首先使用 to_date(20190801,'yyyymmdd') 将值从数字转换为日期

    2: 使用 to_date 运算符获取月份 to_char( to_date(20190801,'yyyymmdd'), 'mm')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM