2016-06-13 108 views
0

我在我们的SQL Server 2008数据库中有以下日期:06-24-1881 00:00:00:000作为DOB,它的存储为datetime格式1800 date in SQL Server&Oracle

我需要将这些数据复制到我们的Oracle 11g数据库中,并且从我的理解中,Oracle不会将毫秒纳入Datetime列。对于1900年以后的数据,我将数据转换为smalldatetime,但它对此数据有效,但不会将其转换为smalldatetime,因为它不允许在1/1/1900之前的日期。

如何将多行数据导入到我的Oracle数据库中?

我尝试这样做:

left(DOB, 19) as DOB 

但呈现的数据为 “1881年6月24日12:00 AM”,所以我试图插入:

to_date('Jun 24 1881 12:00AM', 'MON-DD-YYYY HH:MI:SSAM') 

而且没有任何工作。我被卡住了,需要帮助。

+0

你是什么“提供的日期”是什么意思?如果您能够将日期“转移”到Oracle作为日期时间,则通过会话NLS_date_format的“呈现”是不相关的,Oracle中的内部(存储的)日期时间格式是唯一的,它也包含秒数,并且没有AM后缀;这些仅在显示日期时添加。 – mathguy

回答

0

Jun 24 1881 12:00AM与Oracle格式字符串MON DD YYYY HH12:MIAM匹配。您的格式掩码有一个额外的秒数:SS掩码,Oracle尝试匹配但未在输入中找到,因此会抛出ORA-01861: literal does not match format string异常。

所以,如果从SQL Server输出是该格式随后在甲骨文你应该能够做到:

TO_DATE('Jun 24 1881 12:00AM', 'MON DD YYYY HH12:MIAM') 
0

CONVERT(VARCHAR(20),@Date,101) will give you 06/24/1881我正在寻找代码。

REPLACE(CONVERT(VARCHAR(200),@Date,101),'/','-') + ' 00:00:00:000' 

奇怪我尝试了一堆与转换世纪代码和它的工作对101和其他一些人,但你要失败的113,而是因为你没有几分钟,几小时,秒等,你可以只取101格式并将字符串操作为你想要的。

DECLARE @Date DATE = '06-24-1881 00:00:00:000' 

    SELECT @Date 
     ,FORMAT(@Date, 'MM-dd-yyyy HH:mm:ss') 
,REPLACE(CONVERT(VARCHAR(200),@Date,101),'/','-') + ' 00:00:00:000' 

注意FORMAT(@Date, 'MM-dd-yyyy HH:mm:ss')是SQL 2012或更新版本,运行良好。