当前位置: 首页 > 知识库问答 >
问题:

具有多种日期格式的Oracle Varchar2列

戴靖
2023-03-14

我有一个带有varchar2列(my_column)的表(我的表),该列以几乎所有已知的日期格式灌输可能是日期的数据。比如dd/mm/yyyyy mm/dd/yyyy ddMONyyyy ddmmyyyyy yymmddmm.dd.yydd/mm/yyyy hh: 24: ss mm-dd-yyyy等等。它还可能包含一个免费的文本数据,可能是数字或文本。我需要最快的方法将其检索为日期,如果它不能匹配任何日期格式以检索空

共有2个答案

雍宇定
2023-03-14

简单的答案是:您不能将字符串转换为日期。

您说可能的格式包括“dd/mm/yyyy”和“mm/dd/yyyy”。那么,“2000年2月1日”是什么日期呢?2月1日还是1月2日?你不可能知道这一点,所以转换是不可能的。

话虽如此,您可能希望编写一个存储过程,其中您自己解析文本并且只转换明确的字符串。

例如:是否有包含冒号的子字符串?那么这可能是时间部分。在字符串的其余部分:是否有四位数?那么这可能是年份。依此类推,直到您100%确定这是什么日期/时间,或者您无法明确确定日期(在这种情况下,您希望返回null)。

例如:'13/01/21'看起来非常像2021的1月13日。或者你是否允许2013年,甚至2001年,甚至1921年,或者。。。?如果你知道表中不能有小于2019年的年份,也不能有大于2021的年份,那么年份必须是2021。13不能是月份,所以必须是天,为月份留下01。如果不能排除所有其他选项,则必须返回null。

韩峰
2023-03-14

他说这确实是一种糟糕且危险的储存日期的方法,你可以尝试以下方法:

select myColumn,
       coalesce(
                to_date(myColumn default null on conversion error, 'dd/mm/yyyy' ),
                to_date(myColumn default null on conversion error, 'yyyy mm dd' ),
                ...                                                 /* all the known formats */
                to_date(myColumn default null on conversion error ) /* dangerous */
                )
from myTable

在这里,我将以正确的顺序列出所有可能的预期格式,并试图避免没有格式掩码的截止日期,这可能非常危险,并会给您带来意外的结果。

 类似资料:
  • 我正在尝试用varchar列中的更新日期列 这里,是varchar数据类型,是日期数据类型。有多种类型的日期格式,例如,09302012, 9/30/2012, 2012-09-30和更多不同的类型 如何编写单个查询以在单个查询中使用各种类型的日期格式更新列。 已编辑::: 抱歉搞砸了...我刚刚意识到这些是ssis包中的单独(部分)更新... 我们有不同类型(6)的品牌,每个品牌都会发送不同日期

  • 我正在使用一个不在我控制范围内的API,它使用一个使用Swagger codegen CLI Jar Version2.3.1的Swagger契约,并使用date library选项,语言也是Java。 在API中有几个datetime字段,它们都定义为: 大多数值都包括时区,但有一个值特别不包括时区。因此,我们在以相同方式定义的字段中获得这两种格式: 这会导致反序列化程序出现问题,因为它永远不知

  • 问题内容: 我有一个Java组件来格式化检索的日期。这是我的代码: 只要String具有以下格式,该代码就可以很好地工作 我的问题是,如何调整此代码,使其适用于以下场景,例如,我的字符串可能具有如下值 现在,如果我不通过短信,它将失败。 问题答案: 如果图案中有可选部件,则可以使用和。 例如 盖

  • 问题内容: 当我到达下面的df.date()行时,使用此格式的日期时应用程序崩溃: 致命错误:解开Optional值时意外发现nil 我也看到了这一点: 错误:执行被中断,原因:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0) 我有可以采用这种格式的字符串 但有时采用这种格式 这是在上述格式下崩溃的代码段: 如何使用基本一个功能处理两种格式? 问题答

  • 问题内容: 我得到一个Date对象,我需要将其转换为XMLGregorian Calendar特定格式 我尝试了以下方法 我有一个例外,可以肯定的是我在这里做错了。但是我想将Date对象格式化为指定的格式,这可以完美地由sdf.format完成。 但是,如何为同一对象(来自formattedDate)创建XMLGregorianCalendar对象? 问题答案: 您可以通过date对象本身来实现:

  • 或者,选择多个有效格式将是一个可接受的解决方案。 当前发生的情况: 如果字段的日期格式设置为,将被拒绝。 如果字段的日期格式设置为,则接受(但格式设置为)。