如何在包含单词、三个字母月份和两位数字年份的字符串中搜索月份和年份并将它们转换为 SQL 中的日期?
Posted
技术标签:
【中文标题】如何在包含单词、三个字母月份和两位数字年份的字符串中搜索月份和年份并将它们转换为 SQL 中的日期?【英文标题】: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? 【发布时间】: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> 【参考方案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.2092
和01.01.2095
而不是01.03.1992
和01.01.1995
。
【讨论】:
以上是关于如何在包含单词、三个字母月份和两位数字年份的字符串中搜索月份和年份并将它们转换为 SQL 中的日期?的主要内容,如果未能解决你的问题,请参考以下文章
NSDateFormatter 无法解析德语月份 March/June/Jul 的三个字母缩写