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

时间:2021-02-18 08:50:32

标签: oracle date varchar

我有一个带有 varchar2 列 (my_column) 的表(我的表),该列包含可能是日期的数据,几乎所有已知的日期格式。像 日/月/年 月/日/年 ddMONyyyy dmmyyyyy 年月日 年月日 dd/mm/yyyy hh:24:ss mm-dd-yyyy 和这么多。 它还可以包含可以是数字或文本的自由文本数据。 我需要最快的方式来检索它作为日期,如果它不能匹配任何日期格式来检索空

2 个答案:

答案 0 :(得分:1)

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

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

在这里,我会以正确的顺序列出所有可能的预期格式,并尽量避免没有格式掩码的 to_date,这可能非常危险并会给您带来意想不到的结果。

答案 1 :(得分:0)

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

您说可能的格式包括 'dd/mm/yyyy''mm/dd/yyyy'。那么'01/02/2000'是什么日期? 2月1日还是1月2日?您无法知道这一点,因此无法进行转换。

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

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

示例:'13/01/21' 看起来非常像 2021 年 1 月 13 日。或者您是否允许在您的表中包含 2013 年甚至 2001 年甚至 1921 年或...?如果您知道表中没有小于 2019 年的年份,并且没有大于 2021 年的年份,则年份必须是 2021 年。13 不能是月份,所以它必须是日期,该月份留下 01 .如果您不能排除所有其他选项,那么您将不得不返回 null。

相关问题