Sql 日期时间减法
我必须以分钟为单位计算当前(sysdate)和修改时间的时差:-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'
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
请协助我如何通过将字符转换为日期来获得时差
注:
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指定所需格式,但不能执行日期-时间减法,其中日期为文本格式。