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

将VARCHAR2转换为Date,然后再次将其转换为特定的Date格式

长孙诚
2023-03-14

我们有一个旧表,其中日期字段以多种格式存储在VARCHAR2中。现在我们计划:

1) 将这些数据存储在具有适当日期字段的视图中。

2) 还以单一一致的格式(如MM/DD/YYYY)存储这些内容。

这是为#1所做的:创建一个函数,以便它可以解析VARCHAR2并将其转换为不同格式的DATE,例如:

IF dataTobeConverted IS NOT NULL
        THEN
            IF substr(dataTobeConverted,3,1) = '-'
             THEN retDate:= TO_DATE(dataTobeConverted,'DD-MON-YYYY');
            END IF;

            IF substr(dataTobeConverted,3,1) = '/'
             THEN retDate:= TO_DATE(dataTobeConverted,'MM/DD/YYYY');
            END IF;
        END IF;

RETURN retDate;

对于#2,我们仍然需要将上述两个日期转换为MM/DD/YYYY,其中一个已采用此格式,因此我们需要先转换另一个(“DD-MON-YYYY”),如果条件存储在视图日期字段的MM/DD/YYYY中。所以现在我们需要将日期转换为日期(从一种格式转换为另一种格式并返回日期)

提前感谢!

共有3个答案

彭鹭洋
2023-03-14

正如PrzemyslawKruglej正确指出的那样,您不应该将日期存储在varchar2中。这表示:

alter table oldtable add new_date date;

update oldtable set new_date =
  case
    when substr(old_date,3,1) = '-' then to_date(old_date,'DD-MON-YYYY')
    when substr(old_date,3,1) = '/' then to_date(old_date,'MM/DD/YYYY')
    else null
  end
where old_date is not null;

检查是否已识别每个日期:

select * from oldtable where old_date is not null and new_date is null;

最后:

alter table oldtable drop old_date;
邹时铭
2023-03-14

如果我理解正确,就不必再进行转换-如果将字符串转换为日期数据类型,则无论原始日期(例如,VARCHAR2数据类型)看起来如何,它都以相同的方式存储。

向用户显示数据的方式取决于使用TO_CHAR函数指定的会话参数或模型格式。但是,在内部,DATE存储时没有格式模型。

魏鸿哲
2023-03-14

将这些数据存储在视图中

View不存储实际数据-它只是存储的select语句,仅此而已。

第一个if条件要存储在视图日期字段中的MM/DD/YYYY中

当您使用特定格式将表示日期的字符串文字转换为日期数据类型的值时,并不意味着Oracle将转换后的值存储为该格式。为TO\u DATE()函数提供格式掩码作为第二个参数,只需通知oracle为日期数据类型的值提供适当的内部表示。日期不会以任何特定格式存储。这意味着,一旦您将字符串文字转换为日期数据类型的值,您只需使用to\u char()函数以您喜欢的任何格式显示该日期,或使用nls\u DATE\u format设置的日期表示格式掩码:

SQL> with t1(col) as(
  2    select to_date('21-10-2013', 'dd-mm-yyyy') from dual union all
  3    select to_date('21/10/2013', 'dd/mm/yyyy') from dual union all
  4    select to_date('21.10.2013', 'dd.mm.yyyy') from dual
  5  )
  6  select to_char(col, 'dd/mm/yyyy') as res
  7    from t1
  8  ;


RES
----------
21/10/2013
21/10/2013
21/10/2013
 类似资料:
  • 问题内容: “ 2016年3月10日下午6:30:00”这是我的约会日期,我想将其转换为“ 2016年3月10日”。我可以在android中使用SimpleDateFormat吗?我没有确切的模式来转换它。请帮助并提前感谢 这个步骤行得通吗?如果是,有人可以给我这样的格式吗?提前致谢。 问题答案: 这是您应该使用的修改后的代码: 使用几个小时才能获得正确的时间。 Java 8及更高版本 Java

  • 问题内容: 我正在尝试将Json日期字符串转换为Java日期格式。但是,当涉及到“ return df.parse(tarih)”行时,它将给出错误。 JSON: Java代码: 当我调用此方法时,tarih参数为:/ Date(1323087840000 + 0200)/ 问题答案: 因为您对某个对象感兴趣,所以我认为JSON是Unix时间戳。 因此,我建议您使用Date(long毫秒)构造函数

  • 问题内容: 我只是偶然发现了这一点,找不到任何技术上的解释: 在SQL Server 2014中: 消息529,级别16,状态2,第4行 不允许从数据类型int到日期的显式转换。 为什么from从一个空字符串到and起作用,但是from只能作为as起作用? 我对技术说明感兴趣 问题答案: 我认为这与Microsoft选择支持的问题有关。或多或少地归结为以下事实:允许从数值到日期时间的数据转换,而日

  • 问题内容: 我有一个表,其中有一个名为的列。其数据类型为。 我想对这一栏进行总结。 总计=> 如何使用ANSI SQL或Oracle SQL执行此操作? 问题答案: 您可以使用来分隔小时,分钟和秒,然后将其向上,最后使用function将其转换为type。

  • 错误信息 org.codehaus.jackson.map.jsonMappingException:无法从字符串值“02/23/2013”构造java.util.date实例:无效表示(错误:无法解析日期“02/23/2013”:与任何标准形式(“YYYY-MM-DD't'hh:mm:ss.sssz”、“YYYY-MM-DD't'hh:mm:ss.sss'z'”、“EEE,dd MMM yyyy

  • 标题说明了一切: null 编辑:工作示例要简单得多(多亏了@T.S.): 谢谢!