我必须从当前(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来获得时差。
注意:
我无法进行sysdate-modified,因为sysdate和Modifyed都给出了没有时间的日期,例如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和modified转换为文本并再次转换?
您不仅可以修改sysdate吗?
否,因为sysdate或modified仅给出日期但没有时间戳记
@JonSkeet,因为to_date(修改后,YYYY-MM-DD HH24:MI:SS)仅提供日期2016-05-23,我也需要时差。
修改后的数据类型是什么?
您的问题目前还不清楚。 如果您显示架构,样本数据和预期结果,这将有所帮助。
@cableload,其DATE
@JonSkeet,我更新了问题
您仍然没有告诉我们您方案中modified的类型...
它的日期,已经在上面提到过,有关电缆负载的问题:)
I have to calculate time difference in minutes from current(sysdate) and modified time
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 doesn’t show time
日期始终具有时间成分,并且永远不会在数据库内部具有格式(由7或8个字节表示)-日期的格式由用于访问数据库的客户端程序完成(通常是默认格式) 不是要显示时间成分-但是,时间成分仍然存在)。
您可以在客户端程序的首选项中更改此设置,或者如果不使用它来控制它,则可以通过更改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指定所需的格式,但是不能执行日期时间减法,其中日期是文本格式。
@ MT0谢谢虐待尝试。
@nilFi:似乎您尚未了解MT0告诉您的内容。您将日期时间以DATE格式存储在Oracle数据库中;它由日期和时间组成。您可以添加分钟,减去秒,比较日期时间,以天,分钟,小时为单位的差值……这与显示数据无关。当您要显示日期时间时,请指定格式。通常这是在您的应用中完成的(例如Java,PHP等),然后您决定在此处显示仅显示日期还是仅显示日期加时间或仅显示时间...
...某些应用程序(sqlplus,Toad等)使用NLS_DATE_FORMAT决定如何显示日期时间。因此,例如,当您选择SYSDATE时,它们将使用NLS_DATE_FORMAT并相应地显示日期时间。如果您不希望这样做,则可以更改此设置或在查询中使用TO_CHAR强制显示特定内容(例如TO_CHAR(SYSDATE,hh24:mi))。
而且,"以分钟为单位的时差"不是日期时间,而是时间间隔。在Oracle中减去两个日期时间时,您得到的天数差为十进制数。您可以将其乘以得到小时,分钟或秒等,如图所示。或使用numtodsinterval(, minute)将分钟显示为间隔。
另一种获得两次作为INTERVAL数据类型的差的方法是将两个DATE s都强制转换为TIMESTAMP s-如下:SELECT CAST( SYSDATE AS TIMESTAMP ) - CAST( modified AS TIMESTAMP ) FROM table_name它将输出类似+01 05:30:39.000000的日期,小时,两次之间的分钟和秒。
@Thorsten Kettner感谢您通知与显示数据无关。我印象很深刻,因为我看不到时间,这意味着时间与字段无关:)
@ MT0非常感谢,它的工作是:)