【问题标题】:Change Excel date number to Oracle date将 Excel 日期编号更改为 Oracle 日期
【发布时间】:2013-10-24 07:13:59
【问题描述】:

我在 oracle 中的日期为 41293,如何以 DD/MON/YYYY 格式显示它?

如果我将其复制粘贴到 Excel 中并将其更改为日期格式,则会显示 01/19/13 请帮帮我。

【问题讨论】:

    标签: oracle oracle11g oracle10g


    【解决方案1】:

    引用 Oracle forum:

    您需要一个工具来执行此操作,因为格式是告诉 oracle 您在电子表格中的日期类型上具有哪种格式。虽然您可能没有选择在 Excel 中设置日期格式,但它将在预览器中显示为日期。使用此处的格式作为进入数据类型面板的指南。

    所以,如果您在预览器中有这样的日期,2006 年 1 月 19 日,那么如果您选择插入该列,则数据类型面板的格式将是 DD-MON-YYYY,

    选项 1:

    尝试使用以下功能

    FUNCTION FROMEXCELDATETIME ( ACELLVALUE IN VARCHAR2 )
        RETURN TIMESTAMP
    IS
        EXCEL_BASE_DATE_TIME CONSTANT TIMESTAMP
                := TO_TIMESTAMP ( '12/31/1899',
                               'mm/dd/yyyy' ) ;
    
        VAL CONSTANT NUMBER
                := TO_NUMBER ( NULLIF ( TRIM ( ACELLVALUE ),
                                    '0' ) ) ;
    BEGIN
        RETURN EXCEL_BASE_DATE_TIME
              + NUMTODSINTERVAL ( VAL
                              - CASE
                                    WHEN VAL >= 60
                                    THEN
                                        1
                                    ELSE
                                        0
                                END,
                              'DAY' );
    END;
    
    FUNCTION TOEXCELDATETIME ( ATIMESTAMP IN TIMESTAMP )
        RETURN VARCHAR2
    IS
        EXCEL_BASE_DATE_TIME CONSTANT TIMESTAMP
                := TO_TIMESTAMP ( '12/31/1899',
                               'mm/dd/yyyy' ) ;
    
        DIF CONSTANT INTERVAL DAY ( 9 ) TO SECOND ( 9 )
                := ATIMESTAMP
                   - EXCEL_BASE_DATE_TIME ;
        DAYS CONSTANT INTEGER := EXTRACT ( DAY FROM DIF );
    BEGIN
        RETURN CASE
                  WHEN DIF IS NULL
                  THEN
                      ''
                  ELSE
                      TO_CHAR (  DAYS
                             + CASE
                                   WHEN DAYS >= 60
                                   THEN
                                       1
                                   ELSE
                                       0
                               END
                             + ROUND ( ( EXTRACT ( HOUR FROM DIF )
                                      + ( EXTRACT ( MINUTE FROM DIF )
                                        + EXTRACT ( SECOND FROM DIF )
                                          / 60 )
                                        / 60 )
                                     / 24,
                                     4 ) )
              END;
    END;
    

    选项 2:

    Excel 函数将是=TEXT(B2,"MM/DD/YY"),用于转换存储在 B2 中的 Excel 日期值。然后尝试在Oracle中使用测试字符

    如果考虑 1900 年 1 月 1 日作为开始日期,

    SELECT
          TO_CHAR ( TO_DATE ( '1900-01-01',
                          'YYYY-MM-DD' )
                  + 41293,
                  'DD/MON/YYYY' )
    FROM
          DUAL
    

    【讨论】:

    • 他们在他们的数据仓库中使用这个 41293 作为 period_ID。该表的其他属性是 Calendar date:21-JAN-13, Day_Name: Monday 等。请告诉我将 41293 转换为 21-JAN-13 的 SQL
    • "注意:Excel 将日期存储为连续的序列号,以便它们可以用于计算。1900 年 1 月 1 日是序列号 1,而 2008 年 1 月 1 日是序列号 39448,因为它是 39,447 天1900 年 1 月 1 日之后。” from Microsoft's documentation。这应该是SELECT DATE '1899-12-31' + 41293 FROM DUAL(因为使用 1 月 1 日是一天)?
    【解决方案2】:

    您的值是自 1899 年 12 月 30 日以来的天数。试试:

    select to_char(
      to_date('1899-12-30', 'YYYY-MM-DD') + 41293,
      'DD/MON/YYYY') from dual
    

    【讨论】:

    • 当我执行这个 SQL 时,答案是 2013 年 1 月 19 日,但在数据中给出的值是 21-JAN-13。是客户数据有误还是因为其他因素?
    • 在您的问题中,您写了“它显示 01/19/13”,这是由我的 SQL 语句返回的。但是现在你想要 1 月 21 日?
    • 我刚才检查了客户端数据。很抱歉,但这就是我得到的数据。我认为,我从客户那里得到的数据是错误的。谢谢弗兰克。
    • "注意:Excel 将日期存储为连续的序列号,以便它们可以用于计算。1900 年 1 月 1 日是序列号 1,而 2008 年 1 月 1 日是序列号 39448,因为它是 39,447 天1900 年 1 月 1 日之后。” from Microsoft's documentation。这应该是SELECT DATE '1899-12-31' + 41293 FROM DUAL(因为使用 12 月 30 日是一天)?
    • @FrankSchmitt Excel 认为 60 是1900-02-29;但是,1900 年不是闰年,所以之后的每一天都是 1 天。
    【解决方案3】:

    Microsoft's Documentation

    Excel 将日期存储为连续的序列号,以便在计算中使用它们。 1900 年 1 月 1 日是序列号 1,而 2008 年 1 月 1 日是序列号 39448,因为它是 1900 年 1 月 1 日之后的 39,447 天。

    Excel 有一个 错误 功能,它认为 1900 to be a leap year 和日期 601900-02-29 但那一天从未存在过,需要针对这个错误的一天进行更正。

    它还声明:

    Microsoft Excel 正确处理所有其他闰年,包括不是闰年的世纪年(例如,2100)。只有 1900 年的处理不正确。

    因此只需要一次更正。

    所以:

    • 1900-03-01 之前可以使用DATE '1899-12-31' + value
    • 1900-03-01 或之后,您可以使用DATE '1899-12-30' + value

    可以放入CASE 语句中:

    SELECT CASE
           WHEN value >=  1 AND value < 60
           THEN DATE '1899-12-31' + value
           WHEN value >= 60 AND value < 61
           THEN NULL
           WHEN value >= 61
           THEN DATE '1899-12-30' + value
           END AS converted_date
    FROM   your_table
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-22
      • 1970-01-01
      • 2012-05-14
      • 1970-01-01
      • 2012-11-30
      • 2018-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多