问题:我有一个大型数据库表(~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语句?
答案 0 :(得分:4)
这些日期的格式真的那么重要吗?它们应该是datetime列。然后你可以在该字段上使用日期数学函数。
答案 1 :(得分:3)
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月?