0

我正在尝试使用 varchar 列更新日期列

update tbl set columnA = columnB

这里,columnA是 varchar 数据类型,columnB是日期数据类型。columnA具有多种日期格式,例如 09302012、9/30/2012、2012-09-30 和更多不同类型

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

编辑:::

抱歉搞砸了..我刚刚意识到这些是 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 中,我会直接使用转换和子字符串)

4

3 回答 3

2

You don't.

Firstly you do it properly next time and store dates in a DATE data type; if this is supplied data then you yell1 at your suppliers.

The simplest way to clean your data would be to create a function that tests if a date is in a certain format:

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;

Next you pick a format model and update just that one.

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

You then have to pick a different format model and do it all over again until you don't have any records in your date column that are NULL.

1. Yelling may be a bit much, but make sure you're heard.


This could be distilled into a single query with a large CASE statement:

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
于 2012-12-13T19:21:22.483 回答
0

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

于 2012-12-13T19:24:04.530 回答
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 格式与 09/22/2011 和 9/22 一起使用/2011。所以我们使用 INSTR 函数来确定第一个 '-' 字符的位置。如果该位置是 5,那么我们知道该列是YYYY-MM-DD格式并且可以使用适当的日期掩码。如果位置不是 5,那么我们知道 columnB 在MM/DD/YYYY格式。最后,如果类型不是 1,那么我们知道日期掩码应该是MMDDYYYY

于 2013-05-07T23:15:31.770 回答