Sql 日期时间减法

Sql 日期时间减法,sql,oracle,date,Sql,Oracle,Date,我必须以分钟为单位计算当前(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(whenmodified, 'YYYY-MM-DD HH24:MI:SS'

我必须以分钟为单位计算当前(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(whenmodified, 'YYYY-MM-DD HH24:MI:SS')
输出
2016-05-23 14:55:50

截止日期不显示时间:-

to_date(to_char(modified, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS')
输出:
2016-05-23

请协助我如何通过将字符转换为日期来获得时差

注:

  • 我不能修改sysdate,因为sysdate和modified都给出了没有时间的日期,例如2016-05-23

  • 使用to_char表示sysdate或修改后的给定日期和时间2016-05-23 14:55:50

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

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

    我必须以分钟为单位计算当前(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 
    
    查询

    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 
    
    输出

    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 
    
    并针对您的评论:

    截止日期不显示时间

    日期始终具有时间组件,而从不在数据库内部具有格式(由表示)-日期的格式由用于访问数据库的客户端程序完成(通常默认情况下不显示时间组件-但是,时间组件仍然存在)

    您可以在客户端程序的首选项中更改此设置,或者,如果客户端程序不使用此设置来控制此设置,则可以通过更改
    NLS\u DATE\u FORMAT
    session参数:

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

    为什么要将
    sysdate
    modified
    转换为文本,然后再转换回来?不能只修改sysdate吗?不,因为sysdate或modified只给出日期,而没有时间stamp@JonSkeet,因为截止日期(当修改为“YYYY-MM-DD HH24:MI:SS”时)只给出日期2016-05-23,我也需要时差。修改的数据类型是什么?不确定它到底做什么,我正在处理产品数据。我是否需要运行ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';在运行select查询之前?如果会影响其他任何事情,请让我知道,重要的是我只有只读访问权限database@nilFi:正如MT0所说:日期实际上是一个日期时间,当你想显示它时,你可以在应用程序中根据自己的意愿对其进行格式化。(我猜有一个应用程序,因为您说您正在读取生产数据。)如果您使用的应用程序使用Oracle设置NLS_DATE_格式来显示日期时间,并且无法更改该设置,那么您可以使用to_CHAR在查询中指定所需的格式。您已经知道该函数了。@nilFi请在非生产数据库上亲自尝试它。
    SHUTDOWN IMMEDIATE
    然后
    STARTUP MOUNT
    然后
    ALTER database OPEN READ ONLY
    然后
    ALTER SESSION SET NLS\u DATE\u FORMAT='hh24 yyy ss mi mm dd'
    。即使数据库是只读的,它也会工作,并且你会以自己的奇怪格式获得日期。尝试以其他用户身份连接,但他们无法获取您的日期格式,因为会话参数是每个用户的。@ThorstenKettner yes我可以使用TO_CHAR指定所需格式,但不能执行日期-时间减法,其中日期为文本格式。