【发布时间】:2012-03-08 12:56:16
【问题描述】:
我对 Oracle DATE 和 INTERVAL 数据类型的一些内部工作有疑问。根据Oracle 11.2 SQL Reference,当您减去 2 个 DATE 数据类型时,结果将是 NUMBER 数据类型。
经过粗略的测试,这似乎是真的:
CREATE TABLE test (start_date DATE);
INSERT INTO test (start_date) VALUES (date'2004-08-08');
SELECT (SYSDATE - start_date) from test;
将返回一个 NUMBER 数据类型。
但是现在如果你这样做:
SELECT (SYSDATE - start_date) DAY(5) TO SECOND from test;
你得到一个 INTERVAL 数据类型。换句话说,Oracle 可以将 DATE 减法中的 NUMBER 转换为 INTERVAL 类型。
所以现在我想我可以尝试直接在括号中输入一个 NUMBER 数据类型(而不是执行 'SYSDATE - start_date' 无论如何都会导致一个 NUMBER):
SELECT (1242.12423) DAY(5) TO SECOND from test;
但这会导致错误:
ORA-30083: syntax error was found in interval value expression
所以我的问题是:这里发生了什么?似乎减去日期应该导致一个数字(如 SELECT 语句 #1 所示),它不能自动转换为 INTERVAL 类型(如 SELECT 语句 #3 所示)。但是,如果您使用 DATE 减法表达式而不是输入原始 NUMBER(SELECT 语句 #2),Oracle 似乎能够以某种方式做到这一点。
谢谢
【问题讨论】:
-
当您使用 to_date('20120216', 'yyyymmdd') 代替 sysdate 时会发生这种情况吗?
-
您好,抱歉,直到现在才看到您的评论:S.. 首先回答您的问题,是的,即使它使用 'to_date()' 而不是 SYSDATE,它也会这样做。不过,在另一张纸条上,我设法弄清楚 DATE 减法是如何存储的,所以我将其发布为我的答案:D .. 因为互联网上似乎还没有其他人写过这个,我想我会写下我的发现了。
-
@BYS2 - 为什么要在 () 中输入一个数字,然后尝试从数字中减去天数并将其转换为秒数:SELECT (1242.12423) DAY(5) TO SECOND from test?这是你需要问的。
标签: sql oracle date plsql oracle11g