【发布时间】:2013-10-24 07:13:59
【问题描述】:
我在 oracle 中的日期为 41293,如何以 DD/MON/YYYY 格式显示它?
如果我将其复制粘贴到 Excel 中并将其更改为日期格式,则会显示 01/19/13
请帮帮我。
【问题讨论】:
标签: oracle oracle11g oracle10g
我在 oracle 中的日期为 41293,如何以 DD/MON/YYYY 格式显示它?
如果我将其复制粘贴到 Excel 中并将其更改为日期格式,则会显示 01/19/13
请帮帮我。
【问题讨论】:
标签: oracle oracle11g oracle10g
引用 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
【讨论】:
SELECT DATE '1899-12-31' + 41293 FROM DUAL(因为使用 1 月 1 日是一天)?
您的值是自 1899 年 12 月 30 日以来的天数。试试:
select to_char(
to_date('1899-12-30', 'YYYY-MM-DD') + 41293,
'DD/MON/YYYY') from dual
【讨论】:
SELECT DATE '1899-12-31' + 41293 FROM DUAL(因为使用 12 月 30 日是一天)?
1900-02-29;但是,1900 年不是闰年,所以之后的每一天都是 1 天。
Excel 将日期存储为连续的序列号,以便在计算中使用它们。 1900 年 1 月 1 日是序列号 1,而 2008 年 1 月 1 日是序列号 39448,因为它是 1900 年 1 月 1 日之后的 39,447 天。
Excel 有一个 错误 功能,它认为 1900 to be a leap year 和日期 60 是 1900-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
【讨论】: