当前位置: 首页 > 知识库问答 >
问题:

将具有多种日期格式的字符列转换为日期

谢正初
2023-03-14

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

update tbl set columnA = columnB

这里,列A是varchar数据类型,列B是日期数据类型。列A有多种类型的日期格式,例如,09302012, 9/30/2012, 2012-09-30和更多不同的类型

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

已编辑:::

抱歉搞砸了...我刚刚意识到这些是ssis包中的单独(部分)更新...

我们有不同类型(6)的品牌,每个品牌都会发送不同日期格式的文件

for type 1包含日期格式,如09/22/2011 9/22/2011和2012-09-22

其余所有类型都遵循相同的格式。。its 09222012

所以现在我需要为各个类型编写查询。。。(坦率地说,只有两种逻辑,一种用于类型1,另一种用于其余所有类型)

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

最终结果应该显示为2012-09-22 00:00:00(即yyyy-dd-mm-hh:mm:ss)你能帮我吗

我是一个T-sql的家伙,不知道任何关于pl-sql的东西(如果是在T-sql中,我会直接用convert和substring做i)

共有3个答案

沈英勋
2023-03-14

如果我理解你的问题,我认为你应该能够在一条语句中更新你的表。这不是最优雅的解决方案,但以下方法应该有效。

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-DDhtml" target="_blank">格式,因为我们可以在2011年9月22日和2011年9月22日使用MM/DD/YYYY格式。所以我们使用INSTR函数来确定第一个“-”字符的位置。如果该位置为5,则我们知道该列采用YYYY-MM-DD格式,并且可以使用适当的日期掩码。如果位置不是5,那么我们知道columnB的格式是MM/DD/YYYY。最后,如果类型不是1,那么我们知道日期掩码应该是MMDDYYYY。

辛龙野
2023-03-14

如果我遇到这样的问题,那么我的第一个问题就是如何通过编程检测每行的columnA是什么日期格式。假设它在reasoanble LOE中是可行的(我不知道您的日期格式的完整范围),然后我会看看如何使用CASE表达式来检测格式,然后为每个案例相应地设置日期格式。

劳英华
2023-03-14

你不知道。

首先,您下次要正确地执行此操作,并将日期存储在日期数据类型中;如果这是提供的数据,那么您可以对供应商大喊大叫。

清理数据的最简单方法是创建一个函数,测试日期是否为特定格式:

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;

接下来,您选择一个格式模型并仅更新该模型。

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
 类似资料:
  • 问题内容: 我有一个带有字符串列( varchar(200) )的表,其中包含不同格式的日期。例如 我想将此日期转换为要提取年份的日期。我该怎么办?我使用了STR_TO_DATE,但效果不佳。我必须为每种不同的格式使用SUBSTRING吗? MySQL 5.0.95版 问题答案: 在手册页上有一个检测有效日期的技巧。您可以使用它来确定格式是否有效。 为您期望的所有人提供一种格式。测试像疯了似的。

  • 问题内容: 我想要这种格式 问题答案: 您需要先 解析 日期字符串(使用方法),才能 使用与格式匹配的格式获取对象。 然后使用所需的格式来 格式化 Date对象(Use 方法)以获取字符串。 输出:- 第一种格式是RFC 822 TimeZone与您的日期字符串匹配。有关在日期格式中使用的其他各种选项,请参见。

  • 我在presto上,把日期格式化为varchar,看起来像- 我如何转换这个?

  • 我有一个输入日期作为字符串,格式为dd/MM/yyyy 现在我想把它转换成日期对象,格式为yyyy-MM-dd 目前我正在做 输入为:“2013年4月2日” 但我的约会对象是… 所需输出为:2013-02-04(不是字符串,而是日期对象)

  • 我有一个带有varchar2列(my_column)的表(我的表),该列以几乎所有已知的日期格式灌输可能是日期的数据。比如dd/mm/yyyyy mm/dd/yyyy ddMONyyyy ddmmyyyyy yymmddmm.dd.yydd/mm/yyyy hh: 24: ss mm-dd-yyyy等等。它还可能包含一个免费的文本数据,可能是数字或文本。我需要最快的方法将其检索为日期,如果它不能匹

  • 我得到一串零。有人能帮忙吗?