4

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

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

4

3 回答 3

8

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

select to_char(
  to_date('1899-12-30', 'YYYY-MM-DD') + 41293,
  'DD/MON/YYYY') from dual
于 2013-10-16T08:58:13.323 回答
4

引用 Oracle论坛

您需要一个工具来执行此操作,因为格式是告诉 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
于 2013-10-16T08:56:58.673 回答
0

微软的文档

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

Excel 有一个错误功能,它认为1900 年是闰年,但这一天从未存在过,需要对这个错误的日子进行更正。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
于 2019-09-17T14:07:06.177 回答