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

如何更新以不同字符格式(PL/SQL)存储的日期?,sql,database,oracle,datetime,plsql,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天。(这是对我目标的过分简化,但这样解释更容易) 如果所有日期的格式一致,我将实现以下目

问题:我有一个很大的数据库表(~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;

由于数据库的大小,我无法逐个循环遍历这些值并解析日期值。有人能提出一种无循环的方法来实现这一点吗?比如说,使用大规模更新语句?

IMHO,你有一个更大的问题:

如果有些日期是dd/mm/yyyy,有些日期是mm/dd/yyyy,您如何区分适用于特定日期的格式


例如,我如何知道值“12/09/2008”是指12月还是9月?

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

好吧,这里有一个真正的问题。 1994年7月7日对“年月日”和“年月日”有效 但是,除此之外,您可以尝试嵌套解码。 我在varchar字段中输入了以下日期:

2009年12月1日,2009年12月1日,2009年12月1日,2009年12月1日

使用以下信息,我始终在2009年1月12日返回。您必须找出所有可能的模式,并继续嵌套解码。你可以做的另一件事是创建一个函数来处理这个问题。在该函数中,您可以更详细地检查日期的格式。它也会更容易阅读。您可以在update语句中使用该函数,这样应该比您提到的循环更快。 (无论如何,像这样循环500k行不会花费很长时间。我必须定期更新1200万条记录的逐行表)

选择mydate, 解码(instr(mydate),5到日期(mydate,'yyyyy-MM-DD'),3到日期(mydate,'MM-DD-YYYY'), 解码(长度(mydate),8,截止日期(mydate,'MM/DD/YY'),10,截止日期(mydate,'MM/DD/YYYY')) 从mydates开始

以下是更新声明:

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


我同意你的看法,但是我没有创建数据库,也没有机会更改它!我不得不接受这样的结构(@JJ为什么你不改变它?这与我的问题无关,但是我支持企业应用程序的后端数据库。由于我不能改变应用程序以适应任何数据库架构的更改,我必须保持数据库结构不变。我只能操作数据,而不能操作结构。你可以添加一个额外的列,或者你可以创建一个与表同名的视图,并构建一些而不是触发器。应用程序不必知道。这是一个简单明了的问题,如果您可以使用DD/MM/YYYY和MM/DD/YYYY,那么您的数据实际上已损坏。对此,我能提供的唯一答案是使用日期作为日期-永远不要将日期存储为字符串。除了问题是,如果没有日期作为日期,那么进行有效的日期范围扫描等就不可能了。如果我有这样的麻烦要处理,我会给每个字符串加上日期,使用上面的日期算术函数,然后重新对它们进行字符化,在执行时捕捉异常。PS我可以忍受不知道1/2/2009是指2009年1月2日还是2009年2月1日it’只要我能确定地假设它是一个或另一个,并将其转换为该日期+30天。如果你的所有数据都来自美国,你可能可以这样做,但如果你有国际数据输入,那么你就无法轻松确定这是什么意思。这看起来是我的最佳选择,我会尝试一下,谢谢!祝你好运。如果有,请告诉我你还需要别的什么。我花了很多年的时间在垃圾上做数据转换,就像这样。