如何更新存储为不同字符格式(PL / SQL)的日期?

时间:2009-06-04 12:44:51

标签: sql database oracle datetime plsql

问题:我有一个大型数据库表(~500k记录),其中包含存储在varchar2(15)列中的日期列表。这些日期以不同的格式存储,即。有些是yyyy-mm-dd,有些是mm / dd / yyyy,有些是dd / mm / yy,有些是mm / dd / yy等。即:

1994-01-13
01/13/1994
01/13/94
13/01/94
13/01/1994
etc

我需要稍微改变这些日期,例如每天添加30天。 (这是我的目标的过度简化,但这种解释更容易)。

如果所有日期的格式都一致,我会按如下方式实现:

UPDATE history_table
    SET some_date_col = 
        to_char(to_date(some_date_col, 'mm/dd/yyyy')+30, 'mm/dd/yyyy') 
    WHERE some_date_col IS NOT NULL;

由于数据库的大小,我无法逐个循环遍历值并解析日期值。任何人都可以建议一种方法来实现这一点没有循环,即使用大量的UPDATE语句?

3 个答案:

答案 0 :(得分:4)

这些日期的格式真的那么重要吗?它们应该是datetime列。然后你可以在该字段上使用日期数学函数。

答案 1 :(得分:3)

好吧,你在这里遇到了一个真正的问题。 07/07/1994适用于'MM / DD / YYYY'和'DD / MM / YYYY' 但是,在该问题之外,您可以尝试嵌套解码。 我将以下日期输入varchar字段:

  

01/12 / 2009,01-12-2009,2009-01-12,01 / 12/09

并使用下面的内容,我一直在1/12/2009返回。您必须弄清楚所有可能的模式并保持嵌套解码。你可以做的另一件事是创建一个函数来处理这个问题。在函数中,您可以查看日期格式的更多细节。它也更容易阅读。您可以在更新语句中使用该函数,这样就可以比循环更快,如您所述。 (对于它的价值,循环通过这样的500k行不应该花很长时间。我经常需要逐行更新1200万条记录)

  

选择mydate,   解码(INSTR(数值指明MyDate, ' - '),5,TO_DATE(数值指明MyDate, 'YYYY-MM-DD'),3,TO_DATE(数值指明MyDate, 'MM-DD-YYYY'),   decode(length(mydate),8,to_date(mydate,'MM / DD / YY'),10,to_date(mydate,'MM / DD / YYYY')))   来自mydates;

这是更新声明:

  

更新mydates set revdate = decode(instr(mydate,' - '),5,to_date(mydate,'YYYY-MM-DD'),3,to_date(mydate,'MM-DD-YYYY'),   解码(长度(mydate),8,to_date(mydate,'MM / DD / YY'),10,to_date(mydate,'MM / DD / YYYY')))

答案 2 :(得分:2)

恕我直言,你有一个更大的问题:

如果某些日期是dd / mm / yyyy且有些日期是mm / dd / yyyy,您如何区分哪种格式适用于特定日期?

例如,我怎么知道“12/09/2008”的值是否意味着12月或9月?