转换多个日期格式字符列于日期
我试图从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我会直接做我与转换和子字符串)
你不知道。
首先,您下次正确使用它并将日期存储在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
是的,我用来在供应商所有的时间:) :) – Annjawn
对不起有关混乱起来..我刚刚意识到,这些是个人(件)更新ssis包... 我们有差异类型(6)制造并为每个使他们发送具有不同日期格式的不同文件 对于类型1包含日期格式,如09/22/2011 9/22/2011和2012-09-22 其余所有类型都遵循相同的格式。 09222012 –
所以现在我需要写个别类型的查询...(直接说只有两个逻辑一个类型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。
您的'varchar2'列应该按照您的'to_date'格式掩码以特定格式显示。如果您不知道'varchar2'列中的格式是什么,则可能是一个无尽的'if ... else'来确定'varchar2'列中每一行的格式。这就是为什么日期数据的'varchar2'类型是一个坏主意的原因。 – Annjawn
根据你的'UPDATE'语句,你试图将'DATE'赋给'VARCHAR2'列。根据你的问题的文本和标题,你正在尝试给'DATE'列分配一个'VARCHAR2'。你的'UPDATE'语句是否颠倒过来(即你真的把'columnA','VARCHAR2'分配给'columnB','DATE')? –