java(oracle db)中字符串表示的持续时间减法

java(oracle db)中字符串表示的持续时间减法,java,oracle,date,Java,Oracle,Date,在我的OracleDB中,我有2个VARCHAR2表示持续时间(HH:MM:SS),我需要用java检索它并减去它 例如: Duration_1| Duration_2 00:14:12 00:14:08 我的逻辑是: resultset.getString("Duration_1") - resultset.getString("Duration_2"); //tried this not working 我的预期结果是:00:00:04 我怎样才能做到这一点?Joda Time

在我的OracleDB中,我有2个VARCHAR2表示持续时间(HH:MM:SS),我需要用java检索它并减去它

例如:

Duration_1| Duration_2
 00:14:12   00:14:08
我的逻辑是:

resultset.getString("Duration_1") - resultset.getString("Duration_2");  //tried this not working
我的预期结果是:00:00:04

我怎样才能做到这一点?

Joda Time 你不能像减去字符串那样得到差异。 我建议使用

关于这个问题:


将值转换为时间并减去它们

您可以在Oracle或java中根据自己的喜好进行此操作

下面是一个如何在oracle中执行此操作的示例(它返回两个日期之间的秒数)

相反,如果您需要HH24:MI:SS格式的字符串,可以执行以下操作,将秒数转换为日期,然后将其格式化为所需格式:

select
TO_CHAR(TO_DATE(
  (TO_DATE('10:11:12','HH24:MI:SS') - TO_DATE('10:11:10','HH24:MI:SS')) *60*60*24
  , 'SSSSS')
, 'HH24:MI:SS')
from dual
请注意,如果10:11:12不是保存为VARCHAR,而是保存为oracle中的日期,则查询简化如下:

select
TO_CHAR(TO_DATE(duration_1 - duration_2) *60*60*24, 'SSSSS'), 'HH24:MI:SS')
from dual

这将给您带来差异,注意它们是毫秒,因此将结果除以1000:

java.text.DateFormat format = new java.text.SimpleDateFormat("hh:mm:ss");

java.util.Date d2= df.parse(resultset.getString("Duration_2"));
java.util.Date d1= df.parse(resultset.getString("Duration_1"));

long difference = d1.getTime() - d2.getTime();

在Oracle中,您可以将值转换为
INTERVAL
s,然后减去它们:

Oracle安装程序

CREATE TABLE table_name ( interval1, interval2 ) AS
SELECT '00:14:12', '00:14:08' FROM DUAL
SELECT TO_DSINTERVAL( '0 '||interval1 ) - TO_DSINTERVAL( '0 '||interval2 ) AS difference
FROM   table_name;
     difference
-------------------
+00 00:00:04.000000
SELECT SUBSTR( TO_DSINTERVAL( '0 '||interval1 ) - TO_DSINTERVAL( '0 '||interval2 ), 12, 8 ) AS difference
FROM   table_name;
difference
----------
 00:00:04
查询1-返回间隔

CREATE TABLE table_name ( interval1, interval2 ) AS
SELECT '00:14:12', '00:14:08' FROM DUAL
SELECT TO_DSINTERVAL( '0 '||interval1 ) - TO_DSINTERVAL( '0 '||interval2 ) AS difference
FROM   table_name;
     difference
-------------------
+00 00:00:04.000000
SELECT SUBSTR( TO_DSINTERVAL( '0 '||interval1 ) - TO_DSINTERVAL( '0 '||interval2 ), 12, 8 ) AS difference
FROM   table_name;
difference
----------
 00:00:04
结果

CREATE TABLE table_name ( interval1, interval2 ) AS
SELECT '00:14:12', '00:14:08' FROM DUAL
SELECT TO_DSINTERVAL( '0 '||interval1 ) - TO_DSINTERVAL( '0 '||interval2 ) AS difference
FROM   table_name;
     difference
-------------------
+00 00:00:04.000000
SELECT SUBSTR( TO_DSINTERVAL( '0 '||interval1 ) - TO_DSINTERVAL( '0 '||interval2 ), 12, 8 ) AS difference
FROM   table_name;
difference
----------
 00:00:04
查询2-返回一个
HH24:MI:SS
格式的字符串

CREATE TABLE table_name ( interval1, interval2 ) AS
SELECT '00:14:12', '00:14:08' FROM DUAL
SELECT TO_DSINTERVAL( '0 '||interval1 ) - TO_DSINTERVAL( '0 '||interval2 ) AS difference
FROM   table_name;
     difference
-------------------
+00 00:00:04.000000
SELECT SUBSTR( TO_DSINTERVAL( '0 '||interval1 ) - TO_DSINTERVAL( '0 '||interval2 ), 12, 8 ) AS difference
FROM   table_name;
difference
----------
 00:00:04
结果

CREATE TABLE table_name ( interval1, interval2 ) AS
SELECT '00:14:12', '00:14:08' FROM DUAL
SELECT TO_DSINTERVAL( '0 '||interval1 ) - TO_DSINTERVAL( '0 '||interval2 ) AS difference
FROM   table_name;
     difference
-------------------
+00 00:00:04.000000
SELECT SUBSTR( TO_DSINTERVAL( '0 '||interval1 ) - TO_DSINTERVAL( '0 '||interval2 ), 12, 8 ) AS difference
FROM   table_name;
difference
----------
 00:00:04

你不能这样做不,你不能从一个字符串中减去另一个字符串。提示:在尝试减法之前,将这些值转换成更多的数字…不完全是这样。无需与
24*60*60
相乘,因为它会将其转换为秒。OP希望以
HH24:MI:SS
格式简单地显示它。看,我认为OP想要在Java中而不是在数据库中完成它。如果OP想要那个任意的限制,那么很好-但是,这是一个简单的解决方案,可以在DB中实现,这意味着他们只需要在结果集中返回一个间隔值,而不是两个字符串值,这对其他没有任意限制的人来说可能很有价值。我理解。OP昨天发布了同一个问题唯一的区别是前一个问题是针对Oracle SQL的,而这一个是针对Java的。此外,OP希望以
HH24:MI:SS
格式而不是间隔显示。您可以使用java进行字符串格式设置,也可以将查询结果包装在
SUBSTR(…,12,8)
中,以获得
HH24:MI:SS
字符串格式。@LalitKumarB这是一个公平的答案,因为这个问题特别提到了Oracle数据库。如果原始海报不满意,他们应该努力仔细构思他们的问题。