如何从带有周围字符的 oracle varchar 获取日期时间
Posted
技术标签:
【中文标题】如何从带有周围字符的 oracle varchar 获取日期时间【英文标题】:How to get datetime from oracle varchar with surrounding characters 【发布时间】:2019-01-29 18:06:21 【问题描述】:我有一个 varchar2 'Printed 4/21/2014 3:00:00 AM' 并且只想获得 '4/21/2014 3:00:00 AM' 作为日期。 我的想法是使用类似的东西:
我有:REGEXP_SUBSTR('Printed 4/21/2014 3:00:00 AM', '[0-9/ :APM]*$') 结果:2014 年 4 月 21 日凌晨 3:00:00
然而,
选择 to_date(REGEXP_SUBSTR('2014 年 4 月 21 日上午 3:00:00 打印','[0-9/ :APM]*$'),'YYYY-MM-DD HH24:MI:SS') 从双;
导致“无效月份”错误。
建议?
【问题讨论】:
嗯,这个问题有两个部分。首先,您需要删除任何额外的文本,这不是日期(日期时间)的字符串表示的一部分。这是通过调用REGEXP_SUBSTR
完成的,并且您的查询可以正确执行。但是,在代码中你做了一些你在问题描述中没有提到的事情:你想进一步将TO_DATE
应用于结果。显然,您尝试的问题是生成的日期时间不是'YYYY-MM-DD HH24:MI:SS'
格式,而是'MM/DD/YYYY HH:MI:SS AM'
格式。
你提前知道日期(日期-时间)的格式吗?否则,这最后一部分(与第一部分无关)将无法解决。
啊,我明白了。我真的只需要日期,可以忽略时间。在这种情况下: SELECT to_date(REGEXP_SUBSTR('Printed 4/21/2014', '[0-9\/]*$'), 'MM/DD/YYYY') FROM DUAL;
【参考方案1】:
问题: 由 mathguy 正确识别 - 日期格式
我决定我真的不需要时间戳,因此:
选择 to_date(REGEXP_SUBSTR('2014 年 4 月 21 日印刷','[0-9/]*$'),'MM/DD/YYYY') 从双;
工作正常。
【讨论】:
【参考方案2】:如果格式是固定的 - 包括您要忽略的文本 - 那么您可以将整个字符串转换为日期或时间戳,而无需使用正则表达式或子字符串:
select to_date('Printed 4/21/2014 3:00:00 AM', '"Printed" MM/DD/YYYY HH:MI:SS AM') as result
from dual;
RESULT
-------------------
2014-04-21 03:00:00
固定的“打印”部分被视为a character literal,方法是在格式模型内将该部分用双引号括起来。
如果你真的对时间不感兴趣,那么你可以在之后删除它:
select trunc(to_date('Printed 4/21/2014 3:00:00 AM', '"Printed" MM/DD/YYYY HH:MI:SS AM')) as result
from dual;
RESULT
-------------------
2014-04-21 00:00:00
【讨论】:
以上是关于如何从带有周围字符的 oracle varchar 获取日期时间的主要内容,如果未能解决你的问题,请参考以下文章
从 Oracle Varchar2 中查找和删除非 ASCII 字符
如何计算 Oracle varchar 值中字符的出现次数?
无效的 XML 字符错误 - 如何从 VARCHAR2 数据库列中查找无效字符?