我正在尝试使用varchar列更新日期列
update tbl set columnA = columnB
此处,columnA
是varchar数据类型,columnB
是日期数据类型。 columnA
有各种类型的日期格式,例如,09302012,2012年9月30日,2012-09-30和更多不同的类型
如何编写单个查询以在单个查询中使用各种类型的日期格式更新列。
EDITED :::
抱歉这个混乱......我刚刚意识到这些是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家伙,不知道任何棘手的pl-sql(如果它在t-sql中我将直接使用convert和substring)
答案 0 :(得分:2)
你没有。
首先,您下次正确地执行此操作并将日期存储在DATE数据类型中;如果这是提供的数据,那么您在供应商处喊 1 。
清理数据的最简单方法是创建一个测试日期是否采用某种格式的函数:
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
答案 1 :(得分:0)
如果我遇到这样的问题,那么我的第一个问题是如何以编程方式检测每行的日期格式columnA。 假设它在可重复的LOE中是可行的(我不知道你的日期格式的完整范围),那么我会看到如何使用CASE表达式来检测格式,然后根据每种情况相应地格式化日期。
答案 2 :(得分:0)
如果我理解你的问题,我认为你应该能够在一个声明中更新你的表格。这不是最优雅的解决方案,但以下情况应该有效。
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'));
在上面的语句中,我假设你有一个名为 type 的列,它指示列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 。