转换多个日期格式字符列于日期

问题描述:

我试图从VARCHAR列转换多个日期格式字符列于日期

update tbl set columnA = columnB 

这里与更新日期列,columnA是一个VARCHAR数据类型和columnB是一个日期数据类型。 columnA有各种类型的日期格式,例如,09302012,9/30/2012,2012-09-30和更多不同类型

如何编写单个查询以使用各种类型的日期格式更新列在单个查询中。

EDITED :::

遗憾的乱了..我才意识到,这些都是个人(件)更新中SSIS包...

我们有差异的类型(6)品牌,并每个使他们发送不同的文件有不同的日期格式

1型包含日期格式,与2011年9月22日2011/9/22和2012年9月22日

,其余各类型遵循相同的格式..its 09222012

所以现在我需要编写各种型号...(直说只有两个逻辑一个用于1型和另一个用于其余所有类型)

第一查询逻辑包含三种格式和case语句查询第二个查询逻辑包含其他格式的逻辑...

最终结果应该显示为像2012-09-22 00:00:00(即yyyy-dd-mm hh:mm:ss) can you help我出

是一个T-sql的家伙,不知道任何thng aby pl-sql(如果它在t-sql我会直接做我与转换和子字符串)

+0

您的'varchar2'列应该按照您的'to_date'格式掩码以特定格式显示。如果您不知道'varchar2'列中的格式是什么,则可能是一个无尽的'if ... else'来确定'varchar2'列中每一行的格式。这就是为什么日期数据的'varchar2'类型是一个坏主意的原因。 – Annjawn

+0

根据你的'UPDATE'语句,你试图将'DATE'赋给'VARCHAR2'列。根据你的问题的文本和标题,你正在尝试给'DATE'列分配一个'VARCHAR2'。你的'UPDATE'语句是否颠倒过来(即你真的把'columnA','VARCHAR2'分配给'columnB','DATE')? –

你不知道。

首先,您下次正确使用它并将日期存储在DATE数据类型中;如果这是提供的数据,那么你在供应商处大叫。

来清洁您的数据将是创建一个测试,如果日期是在一定的格式,功能最简单的方法:

create or replace function is_date ( 
     P_String in varchar2 
    , P_Date_Format in varchar2 
    ) return number is 

    l_date date; 

begin 

    l_date := to_date(P_String, P_Date_Format); 

    return 1; 
exception when others then 
    return 0; 
end; 

接下来你选择一个format model和更新只是一个。

update my_table 
    set date_column = to_date(char_column, 'yyyy-mm-dd') 
where is_date(char_column, 'yyyy-mm-dd') = 1 

然后您必须选择一个不同的格式模型并重新执行,直到您的日期列中没有任何记录为NULL。

1.喊叫可能有点多,但要确保听到。


这可以被提炼成一个单一的查询与大CASE语句:

update my_table 
    set date_column = case when is_date(char_column, 'yyyy-mm-dd') = 1 
           then to_date(char_column, 'yyyy-mm-dd') 
          when is_date(char_column, 'yyyymmdd') = 1 
           then to_date(char_column, 'yyyymmdd') 
          ... 
          snip 
          ... 
        end 
+0

是的,我用来在供应商所有的时间:) :) – Annjawn

+0

对不起有关混乱起来..我刚刚意识到,这些是个人(件)更新ssis包... 我们有差异类型(6)制造并为每个使他们发送具有不同日期格式的不同文件 对于类型1包含日期格式,如09/22/2011 9/22/2011和2012-09-22 其余所有类型都遵循相同的格式。 09222012 –

+0

所以现在我需要写个别类型的查询...(直接说只有两个逻辑一个类型1和其他休息所有类型) 第一个查询逻辑包含三种格式的case语句和第二个查询逻辑包含其他格式的逻辑... 最终结果应该显示出来像2012-09-22 00:00:00(即yyyy-dd-mm hh:mm:ss) 可以帮我吗 是一个T-sql的人,不知道任何(如果它在t-sql中,我会直接使用转换和子字符串) –

如果我有这样的问题,那么我的第一个问题是如何以编程方式检测一下日期格式columnA是为每一行。 假设它在一个可重用的LOE(我不知道你的日期格式的完整范围)内是可行的,那么我会看看如何使用CASE表达式来检测格式,然后相应地为每种情况格式化日期。

如果我理解你的问题,我认为你应该能够在一个声明中更新你的表。这不是最优雅的解决方案,但下面的工作。

UPDATE tbl 
    SET columnA = DECODE(type, '1', DECODE(INSTR(columnB, '-'), 5, TO_DATE(columnB, 'YYYY-MM-DD'), 
                    TO_DATE(columnB, 'MM/DD/YYYY')), 
            TO_DATE(columnB, 'MMDDYYYY')); 

在上面的语句我假设你有一个名为列指示哪个日期格式列B是,以上语句使用DECODE来确定类型为1。由于类型1有3种可能的格式,然后声明将尝试确定columnB的格式。为了使我们的工作更容易,我们只需要测试YYYY-MM-DD格式,因为我们可以同时使用MM/DD/YYYY格式2011年9月22日和2011年9月22日。所以我们使用INSTR函数来确定第一个' - '字符的位置。如果该位置是5,那么我们知道该列的格式为YYYY-MM-DD格式,并且可以使用适当的日期掩码。如果位置不是5,那么我们知道columnB的格式为MM/DD/YYYY格式。最后,如果类型不是1,那么我们知道日期掩码应该是MMDDYYYY