如果 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),则返回两个日期之间的天数的主要内容,如果未能解决你的问题,请参考以下文章

具有特定格式 RGB-565 的 UIImage

我需要一个意图来选择具有特定格式的视频

Jquery:TableSorter-具有特定格式的日期不起作用

具有特定格式和 GMT 的 JQuery 更新日期

如何格式化具有特定位数的数字?

如何从具有特定格式的数据框中保存 json?