【问题标题】:How to search in a string containing words, three letter month and two digit year for the month and year and convert them to a date in SQL?如何在包含单词、三个字母月份和两位数字年份的字符串中搜索月份和年份并将它们转换为 SQL 中的日期?
【发布时间】:2019-09-02 12:42:17
【问题描述】:

我有一个表格,其中一列包含以下格式的字符串:

ENGLISH.JOHN.BROWN.MAR.92
GERMAN.TIM.OLIVER.JAN.95

我需要获取月份和年份并将它们转换为'01-MAR-92'和'01-JAN-95'格式的日期,目标是根据这个月份和年份对表中的数据进行排序?

我是 sql 新手,所以我不知道从哪里开始。非常感谢您提供的任何建议。

我尝试使用 order by,但该列按字母顺序排列。

【问题讨论】:

  • 我正在使用 Toad。
  • Toad 可用于不同的 dbms 产品。你连接到哪一个?
  • 我正在使用 Toad for Oracle。我希望这就是您正在寻找的。​​span>

标签: sql oracle sql-order-by


【解决方案1】:

假设您的月年数据始终具有MON-YY 格式,那么您不需要使用(慢)正则表达式,只需使用简单的字符串函数来获取最后 6 个字符的子字符串并将其解析为日期:

Oracle 设置

CREATE TABLE your_table( your_column ) AS
  SELECT 'ENGLISH.JOHN.BROWN.MAR.92' FROM DUAL UNION ALL
  SELECT 'GERMAN.TIM.OLIVER.JAN.95'  FROM DUAL;

查询

SELECT TO_DATE( SUBSTR( your_column, -6 ), 'MON.RR' ) AS date_value
FROM   your_table;

输出

| DATE_VALUE | | :--------- | | 01-MAR-92 | | 95 年 1 月 1 日 |

db小提琴here

如果您可以有可变长度的月份(有时是字符,有时是数字),那么您可以通过字符串倒数并找到列表中倒数第二个点:

SELECT TO_DATE( SUBSTR( your_column, INSTR( your_column, '.', -1, 2 ) + 1 ), 'MON.RR' )
         AS date_value
FROM   your_table;

【讨论】:

    【解决方案2】:

    您可以将 substr 与 instr 一起使用,如下所示。

    Select
    
    
    to_date(substr(your_string,instr(your_string, '.',1,3)+1), 'mon.yy') 
    from your_table
    

    干杯!!

    【讨论】:

    • YY 可能不是最合适的格式模型,因为当数据可能指上世纪末(即1992).
    【解决方案3】:

    您可以将regexp_substr() 解析函数与to_char()to_date() 函数一起使用:

    with tab(str) as
    (
     select 'ENGLISH.JOHN.BROWN.MAR.92' from dual union all
     select 'GERMAN.TIM.OLIVER.JAN.95'  from dual   
    )
    select to_date(
                    regexp_substr(str,'[^.]+',1,4)||regexp_substr(str,'[^.]+',1,5),'MONRR' ) 
        as "MyDate"
      from tab;
    
    MyDate
    ---------
    01-MAR-92
    01-JAN-95
    

    Demo

    最好使用MONRR 模式而不是MONYY,因为to_date(regexp_substr(str,'[^.]+',1,4)||regexp_substr(str,'[^.]+',1,5),'MONYY') 转换可能会产生意想不到的结果,例如01.03.209201.01.2095 而不是01.03.199201.01.1995

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-17
      • 2022-08-09
      • 1970-01-01
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      • 2018-12-24
      • 1970-01-01
      相关资源
      最近更新 更多