【问题标题】:Format 1800 date in SQL Server & Oracle在 SQL Server 和 Oracle 中格式化 1800 日期
【发布时间】:2016-06-13 21:48:23
【问题描述】:

我的 SQL Server 2008 数据库中有以下日期:06-24-1881 00:00:00:000 作为DOB,它存储为datetime

我需要将此数据复制到我们的 Oracle 11g 数据库中,据我了解,Oracle 不接受毫秒到 Datetime 列。对于 1900 年之后的数据,我将数据转换为 smalldatetime 并且它有效,但对于这段数据,它不会转换为 smalldatetime,因为它不允许 1900 年 1 月 1 日之前的日期。

如何将多行数据放入我的 Oracle 数据库?

我试过这个:

left(DOB, 19) as DOB

但这将数据呈现为“Jun 24 1881 12:00AM”,所以我尝试插入:

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

这也没有用。我被困住了,需要帮助。

【问题讨论】:

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

标签: sql oracle sql-server-2008


【解决方案1】:

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

因此,如果 SQL Server 的输出采用该格式,那么在 Oracle 中您应该可以这样做:

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

【讨论】:

    【解决方案2】:

    CONVERT(VARCHAR(20),@Date,101) 会给你 06/24/1881 我现在正在寻找代码。

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

    奇怪的是,我用 CONVERT 尝试了一堆世纪代码,它适用于 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 或更新版本,并且运行良好。

    【讨论】:

      猜你喜欢
      • 2018-07-23
      • 2015-02-21
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      • 2011-06-03
      • 1970-01-01
      • 2019-08-04
      • 1970-01-01
      相关资源
      最近更新 更多