【问题标题】:Oracle : Date time subtractionOracle:日期时间减法
【发布时间】:2016-05-23 13:11:57
【问题描述】:

我必须计算当前(sysdate)和修改时间的分钟时差:-

to_date(to_char(sysdate, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS')
- to_date(to_char(modified, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS')

但问题是 to_char 返回正确的时间:-

to_char(whenmodified, 'YYYY-MM-DD HH24:MI:SS')

输出2016-05-23 14:55:50

并且 to_date 不显示时间:-

to_date(to_char(modified, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS')

输出:2016-05-23

请帮助我如何通过将 to_char 转换为 to_date 来获得时差。

注意:

  1. 我不能这样做 sysdate-modified 因为 sysdate 和 modified 都给出没有时间的日期,例如 2016-05-23

  2. 将 to_char 用于 sysdate 或修改后的给定日期,时间为 2016-05-23 14:55:50

  3. 由于我们不能在 to_char 函数中减去日期,我再次将它们转换回 to_date 以获得时间。

我期待: 2016-05-23 14:55:50 - 2016-05-23 14:53:50 = 2 分钟

【问题讨论】:

  • 为什么要将sysdatemodified 转换为文本然后再转换回来?
  • 你不能只做 sysdate-modified 吗?
  • 不,因为 sysdate 或 modified 只给出日期但没有时间戳
  • @JonSkeet,因为 to_date(whenmodified, 'YYYY-MM-DD HH24:MI:SS') 只给出日期 2016-05-23 我也需要时差。
  • 修改的数据类型是什么?

标签: sql oracle date


【解决方案1】:

我必须计算当前(sysdate)和修改时间的时间差(以分钟为单位)

Oracle 设置

CREATE TABLE table_name ( modified DATE );

INSERT INTO table_name
SELECT TIMESTAMP '2016-05-23 14:20:00' FROM DUAL UNION ALL
SELECT TIMESTAMP '2016-05-23 00:00:00' FROM DUAL UNION ALL
SELECT TIMESTAMP '2016-05-01 00:00:00' FROM DUAL UNION ALL
SELECT TIMESTAMP '2016-01-01 00:00:00' FROM DUAL;

查询

SELECT ( sysdate - modified ) * 24 * 60 AS minute_difference
FROM   table_name;

输出

MINUTE_DIFFERENCE
-----------------
       3.66666667 
       863.666667 
       32543.6667 
       206783.667 

为了解决您的评论:

to_date 不显示时间

日期总是有一个时间组件,从不在数据库内部有一个格式(它由7 or 8 bytes表示) - 日期的格式已经完成由您用来访问数据库的客户端程序(通常默认情况下不显示时间组件 - 但是,时间组件仍然存在)。

您可以在客户端程序的首选项中更改此设置,或者,如果他们不使用它来控制它,则通过更改 NLS_DATE_FORMAT 会话参数:

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

【讨论】:

  • 不确定它到底是做什么的,我正在处理产品数据。我是否需要运行 ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';在运行我的选择查询之前?如果会影响其他任何事情,请告诉我
  • 重要的是我只有对数据库的只读访问权限
  • @nilFi:正如MT0所说:日期确实是一个日期时间,你可以在你的应用程序中根据你的意愿在你想要显示它的时候格式化它。 (我猜有一个应用程序,因为您说您正在读取生产数据。)如果您使用的应用程序使用 Oracle 设置 NLS_DATE_FORMAT 来显示日期时间并且您无法更改该设置,那么您可以使用 TO_CHAR 指定查询中所需的格式。你已经知道这个功能了。
  • @nilFi 在非生产数据库上亲自尝试SHUTDOWN IMMEDIATE 然后STARTUP MOUNT 然后ALTER DATABASE OPEN READ ONLY 然后ALTER SESSION SET NLS_DATE_FORMAT = 'hh24 yyyy ss mi mm dd'。即使数据库是只读的,它也可以工作,并且您将以自己的奇怪格式获得日期。尝试以其他用户身份连接,但由于会话参数是每个用户的,因此他们不会获得您的日期格式。
  • @ThorstenKettner 是的,我可以使用 TO_CHAR 指定所需的格式,但不能进行日期时间减法,其中日期为文本格式。
猜你喜欢
  • 1970-01-01
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-06
  • 2015-06-21
  • 2012-03-20
相关资源
最近更新 更多