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

数据类型从varchar2到日期、数字等的隐式转换

常光明
2023-03-14

假设我有一些列当前是 varchar2 值,在表中Table_A。

鉴于它们是日期的正确格式(通过带有to_date的更新语句格式化),并且我想将具有原始varchar2值的Table_A中的数据插入到具有相应Date列的Table_B中——如果日期格式正确,Oracle会隐式地从varchar2转换为Date吗?

同样,我想知道Oracle是否会将存储为Varchar2的十进制数字转换为目标表中具有相应正确格式的数字(N, M)。

我问这个问题的原因是想看看是否可以避免编写大型查询,这些查询必须在执行select之前先切换列类型,然后再插入到目标表中。

共有2个答案

石喜
2023-03-14

对于数字来说,答案更简单——只要小数分隔符在所有表和列中保持一致。如果一个表中的一列格式为< code>33.29,而另一个表中的一列格式为< code>33,29,因为它使用逗号作为小数点分隔符,那么就会出现问题。

对于日期,它会有点复杂-特别是如果一些日期像<code>的“12/31/2020”,而另一些日期像是<code>的“12/31/2020 00:00”。

如果所有数字都采用完全相同的格式,如果所有日期都采用完全相同的格式,则应该有效;对于日期,您需要确保nls_date_format与您的字符串格式相同(或使用改变会话更改它),对于数字,您必须确保nls_numeric_characters显示与您的数字字符串相同的十进制分隔符(如果使用,则使用相同的分组分隔符)。

我可能会为“播放”数据库(例如,用于测试)或在您不能造成太大损害的环境中执行您建议的事情。我不会在生产中这样做,如果非平凡的事情取决于数据库和其中的数据。

薛晨
2023-03-14

你可以做到这一点,这一切都是为了NLS_DATE_FORMAT。但存在风险:

create table a(
  pk integer not null,
  dt varchar2(30)
);
create table b(
  pk integer not null,
  dt date
);
--
-- This example shows date truncation because of the nls_date_format
--
alter session set nls_date_format='DD-MON-YYYY';
insert into b values(1, sysdate);
select to_char(dt, 'YYYY-MM-DD HH24:MI:SS') dt from b;
-- 2021-02-02 11:53:05
insert into a select * from b;
select * from a;
-- 02-FEB-2021
delete b;
insert into b select * from a;
select to_char(dt, 'YYYY-MM-DD HH24:MI:SS') dt from b;
-- 2021-02-02 00:00:00

--
-- This example shows a working conversion
---
alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS';
delete a;
delete b;
insert into b values(1, sysdate);
select to_char(dt, 'YYYY-MM-DD HH24:MI:SS') dt from b;
-- 2021-02-02 11:53:05
insert into a select * from b;
select * from a;
-- 2021-02-02 11:53:05
delete b;
insert into b select * from a;
select to_char(dt, 'YYYY-MM-DD HH24:MI:SS') dt from b;
-- 2021-02-02 11:53:05

--
-- This example shows a failure because of bad date mask.
--
alter session set nls_date_format='YYYY-MM-DD';
delete a;
delete b;
insert into b values(1, sysdate);
select to_char(dt, 'YYYY-MM-DD HH24:MI:SS') dt from b;
-- 2021-02-02 11:53:05
insert into a select * from b;
select * from a;
-- 2021-02-02
alter session set nls_date_format='Dy DD/MM HH24:MI:SS';
delete b;
insert into b select * from a;
-- ORA-01846: not a valid day of the week

总之,除非绝对必要,否则不要做。如果必须这样做,请确保在执行SQL之前,通过在脚本中设置它来控制< code>nls_date_mask。

 类似资料:
  • 我有一个Oracle表,其中列类型为CLOB。我想保留列顺序并将数据类型更改为VARCHAR2。该列只包含文本。 我得到了一个标准的信息: 我们将不胜感激。我已经在这方面工作了一段时间了。如果你有任何问题请告诉我。

  • 问题内容: 我有一个熊猫数据框,其中一列包含格式为日期的字符串 例如 目前该列的是。 如何将列值转换为Pandas日期格式? 问题答案: 使用类型

  • 本文向大家介绍mongodb 数据类型(null/字符串/数字/日期/内嵌文档/数组等),包括了mongodb 数据类型(null/字符串/数字/日期/内嵌文档/数组等)的使用技巧和注意事项,需要的朋友参考一下 MongoDB的文档类似于JSON,JSON只是一种简单的表示数据的方式,只包含了6种数据类型(null、布尔、数字、字符串、数组及对象). JSON的数据类型的局限性: 1.无日期类型,

  • 本文向大家介绍简单介绍JavaScript数据类型之隐式类型转换,包括了简单介绍JavaScript数据类型之隐式类型转换的使用技巧和注意事项,需要的朋友参考一下 JavaScript的数据类型分为六种,分别为null,undefined,boolean,string,number,object。object是引用类型,其它的五种是基本类型或者是原始类型。我们可以用typeof方法打印来某个是属于

  • 问题内容: 如何从SQL数据库获取日期数据类型到Java?到目前为止,我已经使用此代码,但无法获取日期。 问题答案: 您有两个选择。 1-使用sql date对象的getTime方法获取sql date对象并构造utils日期, 或者 2-调用getTimeStamp而不是getDate,它将返回sql timeStamp类的对象,该对象实际上是java.util.Date的子类。

  • 我试图通过获取日期然后填充表来获取存储在数据库中的数据。 这里的问题是,它给了我一个错误异常: Java语言lang.ClassCastException:类java。无法将lang.字符串转换为类java。util。日期(java.lang.String和java.util.Date位于加载程序“bootstrap”的模块java.base中) 我知道怎么了,因为 因此,有没有办法将给定值更改为