如果 DATE 具有特定格式(NOT DATE),则返回两个日期之间的天数
Posted
技术标签:
【中文标题】如果 DATE 具有特定格式(NOT DATE),则返回两个日期之间的天数【英文标题】:Return number of days between two dates, if DATE has a spicific format(NOT DATE) 【发布时间】:2013-11-20 13:15:19 【问题描述】:我开发了使用 Oracle10g 数据库的特定软件。
本软件在 DB 中有自己的 DATE、TIME 格式: CurrentDate = 自 01.01.0001 以来经过的天数。 该数字以整数值形式存储在 DB 中,例如:当前日期等于 735192。
我需要将 SYSDATE 转换为这种格式。如何通过 Oracle 做到这一点?
我试着写了一些函数和 SQL 请求:
CREATE OR REPLACE
FUNCTION MyDaysBetween(aNow IN NUMBER,aThen IN NUMBER) RETURN NUMBER;
IS BEGIN
IF(aNow > aThen) THEN
RETURN (aNow - aThen);
ELSE
RETURN (aThen - aNow);
END IF;
END MyDaysBetween;
FUNCTION QAZ_SYSDATENOW() RETURN NUMBER; /*Converting SYSDATE(20.11.2013) to number of days since 01.01.0001*/
IS
BEGIN
RETURN SELECT SYSDATE - TO_DATE('01.01.0001','DD.MM.YYYY') FROM DUAL;
END MyDaysBetween;
SELECT * FROM TESTS T WHERE (MyDaysBetween(QAZ_SYSDATENOW(),T.D2) = 5); /*T.D2 contains 15.11.2013 asinteger number of days */
但是有些东西不起作用,我找不到问题所在。
【问题讨论】:
我建议去掉 SYSDATE 后面的括号。 我删除了它,没有任何改变。如何调试脚本?如何在运行时查看返回函数? 调试器(Oracle 的 SQLDeveloper IDE 有一个)或 dbms_output 包也可以帮助您了解正在发生的事情。 【参考方案1】:好吧,我几乎不是先知,我什至没有玻璃球或茶渣,所以我无法理解您所说的“但有些东西不起作用”是什么意思,但是,您的主要问题是使用 QAZ_SYSDATENOW
函数 - 您不能像在 PL/SQL 中那样使用 SELECT
,您必须使用 SELECT ... INTO
,或者在这种情况下,只需 RETURN
减法的结果。看看这个:
CREATE OR REPLACE
FUNCTION MyDaysBetween(aNow IN NUMBER,aThen IN NUMBER) RETURN NUMBER
IS BEGIN
IF(aNow > aThen) THEN
RETURN (aNow - aThen);
ELSE
RETURN (aThen - aNow);
END IF;
END MyDaysBetween;
/
CREATE OR REPLACE
FUNCTION QAZ_SYSDATENOW RETURN NUMBER
IS
BEGIN
RETURN SYSDATE - TO_DATE('01.01.0001','DD.MM.YYYY');
END QAZ_SYSDATENOW;
/
我去掉了RETURN
中的SELECT
,只返回表达式的值。
测试:
SELECT MyDaysBetween(TRUNC(QAZ_SYSDATENOW), T.D2) AS val
FROM (SELECT TRUNC(SYSDATE) - 5 - TO_DATE('01.01.0001','DD.MM.YYYY') d2
FROM dual
) t
;
如您所见,我使用您的函数计算从今天 (QAZ_SYSDATENOW
) 到 5 天前的天数。我使用TRUNC
两次来去掉小数部分。如果您需要,请删除TRUNC
。
输出:
值 ---------- 5
【讨论】:
是的,它有效,但是: 1. 为什么选择 SELECT?我只需要请求其他测试表字段的下一个 IF 操作的结果编号。 2. 你的例子中的“- 5 -”是什么? @Alexandr 我提供的SELECT
语句只是对您的功能的测试。您可以随心所欲地使用您的功能。我的目的是向你展示它是有效的。 -5
只是获取 5 天前的日期,只是为了测试,稍后从 SYSDATE
中减去它以表明该功能有效。以上是关于如果 DATE 具有特定格式(NOT DATE),则返回两个日期之间的天数的主要内容,如果未能解决你的问题,请参考以下文章