如何获取 Oracle 11g 中两个日期之间的天数? [复制]

Posted

技术标签:

【中文标题】如何获取 Oracle 11g 中两个日期之间的天数? [复制]【英文标题】:How can I get the number of days between 2 dates in Oracle 11g? [duplicate] 【发布时间】:2010-12-11 09:16:53 【问题描述】:

我试图在 Oracle 11g 中查找两个日期之间的整数天数。

我可以通过这样做来接近

select sysdate - to_date('2009-10-01', 'yyyy-mm-dd') from dual

但这会返回一个间隔,我还没有成功地将它转换为整数。

编辑:显然在 10g 中,这会将天数作为整数返回。

【问题讨论】:

SQL 应该返回一个数值,而不是一个区间 仅 10 多年后 - here's a db<>fiddle 演示了从日期中减去日期(例如 SYSDATE)和从时间戳中减去日期(例如 SYSTIMESTAMP)之间的区别。前者产生一个表示两个日期之间天数的数字,而后者产生一个表示两个日期之间天数的间隔。实际上,在计算中的任何位置引入 TIMESTAMP 都会导致返回 INTERVAL,因此可能 OP 重新定义了 SYSDATE。 【参考方案1】:

或者你可以这样做:

select trunc(sysdate) - to_date('2009-10-01', 'yyyy-mm-dd') from dual

这会返回 NUMBER 天:

SQL> create view v as 
  2  select trunc(sysdate) - to_date('2009-10-01', 'yyyy-mm-dd') diff 
  3  from dual;

View created.

SQL> select * from v;

      DIFF
----------
        29

SQL> desc v
 Name                   Null?    Type
 ---------------------- -------- ------------------------
 DIFF                            NUMBER(38)

【讨论】:

这仍然返回一个 INTERVAL DAY TO SECOND 不,不是,你为什么这么说? 证明它返回一个 NUMBER 而不是一个 INTERVAL DAY TO SECOND 添加到答案。【参考方案2】:

我自己想通了。我需要

select extract(day from sysdate - to_date('2009-10-01', 'yyyy-mm-dd')) from dual

【讨论】:

很奇怪。与其他回答者一样,当我进行原始查询时,我得到的是一个数字,而不是一个间隔。当我尝试您的解决方案时,我收到一个错误 ORA-30076: invalid extract field for extract source。这是在 Oracle 10g 中;你用的是什么版本? 11g。可能就是这样。谢谢戴夫。 使用 systimestamp 而不是 sysdate 意味着它执行时间戳而不是日期算术,因此会给出 INTERVALs。但我无法重现您对 sysdate 的体验。 select extract(day from sysdate - cast(date '2009-10-01' as timestamp)) from dual 我认为@Tony Andrews 更好地回答了这个问题。【参考方案3】:

您可以尝试使用:

select trunc(sysdate - to_date('2009-10-01', 'yyyy-mm-dd')) as days from dual

【讨论】:

trunc() 对我不起作用。我收到了这个错误:不一致的数据类型:预期的数字,得到 INTERVAL DAY TO SECOND 哦是的 .. 因为你在第二次约会中没有 HH24:MI:SS 部分 .. 很高兴你自己弄清楚了【参考方案4】:

这将工作我已经测试了自己。 它给出了从列 admissiondate 获取的 sysdate 和日期之间的差异

  TABLE SCHEMA:
    CREATE TABLE "ADMIN"."DUESTESTING" 
    (   
  "TOTAL" NUMBER(*,0), 
"DUES" NUMBER(*,0), 
"ADMITDATE" TIMESTAMP (6), 
"DISCHARGEDATE" TIMESTAMP (6)
    )

EXAMPLE:
select TO_NUMBER(trunc(sysdate) - to_date(to_char(admitdate, 'yyyy-mm-dd'),'yyyy-mm-dd')) from admin.duestesting where total=300

【讨论】:

【参考方案5】:

月底和今天开始之间的整天,包括当月的最后一天:

SELECT LAST_DAY (TRUNC(SysDate)) - TRUNC(SysDate) + 1 FROM dual

使用准确时间之间的天数:

SELECT SysDate - TO_DATE('2018-01-01','YYYY-MM-DD') FROM dual

【讨论】:

【参考方案6】:

请参考以下查询以获得您的答案。我在第二部分选择了一个虚拟日期。您可以根据您的要求将其替换为任何日期。

SELECT TO_DATE(SysDate,'YYYY-MM-DD')  - TO_DATE('2018-01-01','YYYY-MM-DD') FROM dual

【讨论】:

以上是关于如何获取 Oracle 11g 中两个日期之间的天数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

选择日期不在列表中的两个日期之间的天差

获取两个日期字符串之间的所有天数

如何在 oracle sql 中提取两个日期之间的天数?

获取Oracle中两个日期之间的天数,包括日期

求教用java编写一个程序要求给定一个日期值,计算若干天后的日期值,和给定两个日期计算它们之间相距的天

MySQL日期时间的天,小时和分钟数