【问题标题】:Oracle SQL - Extract YYYYMM from YYYYMMDD, when column type is NUMBER(38)Oracle SQL - 当列类型为 NUMBER(38) 时,从 YYYYMMDD 中提取 YYYYMM
【发布时间】:2016-07-09 20:37:35
【问题描述】:

我有一个名为DATEOFORDER 的列,它的类型是NUMBER(38)

当我运行 SELECT 查询时,我会得到年-月-日结果,例如:

20161230、20160531 或 20170330

我希望实现的是将显示的字符数限制为仅限年月。所以我会得到以下信息:

201612、201605 或 201703

我厌倦了使用 TO_CHAR 或 EXTRACT 等函数,但没有成功。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您始终可以除以 100 以删除最后 2 位数字。所以这样的事情可以工作:

    select to_char(trunc(dateoforder / 100))
      from tbl
    

    【讨论】:

      【解决方案2】:

      Oracle 设置

      CREATE TABLE your_table ( dateoforder ) AS
      SELECT '20161230, 20160531 or 20170330' FROM DUAL UNION ALL
      SELECT '20161230' FROM DUAL UNION ALL
      SELECT '20160531' FROM DUAL UNION ALL
      SELECT '20170330' FROM DUAL;
      

      查询

      SELECT REGEXP_REPLACE( dateoforder, '(\d{6})\d{2}', '\1' ) AS monthoforder
      FROM   your_table
      

      输出

      MONTHOFORDER
      ------------------------
      201612, 201605 or 201703
      201612
      201605
      201703
      

      【讨论】:

      • 感谢您的迅速回复。不幸的是,我收到一条错误消息:ORA-00904: "REGEXP_REPLACE": invalid identifier.
      • 您运行的查询是什么?逐字复制时,上面的内容没有错误。这是Oracle documentation for REGEXP_REPLACE
      • 我是一个刚刚开始使用 SQL 的初学者。所以很有可能我做错了什么。不过,非常感谢您回复我的帖子。
      • 它是一个数字字段,所以字符串'20161230、20160531或20170330'是不可能的。
      【解决方案3】:
      select substr(to_char(dateoforder), 1, 6) from tbl
      

      【讨论】:

        【解决方案4】:

        您应该使用 substr(string, a,b) 运算符从 string 中选择一个子字符串,其值在 ab 之间,正如 mathguy 建议的那样。

        要获取字符串,您应该在 dateoforder 上使用 to_char。

        【讨论】:

          猜你喜欢
          • 2021-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多