【发布时间】:2014-04-16 22:09:45
【问题描述】:
我是 Oracle 开发的新手,并且仍在发现它的许多功能以及 PL/SQL 和 SQL Server 的 T-SQL 之间的差异。
所以我的“项目”是创建一个函数,该函数可以从未来或过去生成随机日期。用户应该能够指定创建日期的上限/下限。
我可能为时已晚,但为了简洁起见,我将跳过有关该函数为何执行此操作以及如何执行此操作的详细信息。与实际问题重要且相关的是以下行为。
BEGIN
SYS.DBMS_OUTPUT.PUT_LINE(TO_DATE(TRUNC(SYSDATE + 6469), 'yyyy/mm/dd')); -- Dec 31, 2031
SYS.DBMS_OUTPUT.PUT_LINE(TO_DATE(TRUNC(SYSDATE - 4853), 'yyyy/mm/dd')); -- Jan 01, 2001
SYS.DBMS_OUTPUT.PUT_LINE(TO_DATE(TRUNC(SYSDATE + 7000), 'yyyy/mm/dd')); -- ERROR
END
简单地说,当我在 SYSTEM 日期中添加足够多的天数以超过 2031 年 12 月 31 日时,我收到以下错误消息... “在需要数字的地方发现了一个非数字字符” ... .当我从 SYSTEM 日期减去 2001 年 1 月 1 日之前的足够天数时,我遇到了同样的问题。
当我删除格式时,它不会中断,但会返回一个不可能的日期......
BEGIN
-- returns 15-JUN-33
-- June 33rd 2015!!
SYS.DBMS_OUTPUT.PUT_LINE(TO_DATE(TRUNC(SYSDATE + 7000)));
END
所以在我看来,这个函数有某种日期范围限制...... 2001 年 1 月 1 日 - 2031 年 12 月 31 日......这是真的还是我在这里做错了什么?
谢谢!
【问题讨论】:
-
暂时忘记所有这些功能。你犯的错误可能会扭曲你的结果。相反,试试这个:to_char(sysdate + 7000, 'yyyy/mm/dd')。至于你做错了什么,请阅读 to_date 和 trunc 上的文档。注意它们返回的数据类型。