如何从带有周围字符的 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 数据库列中查找无效字符?

如何在 Oracle 表的 varchar 列中的第二个和第四个字符之后插入“/”

oracle函数返回varchars数组,在c#中

Oracle的varchar2如何比较大小