给您的重要建议:请不要将时间间隔存储为字符串 (CHAR/ VARCHAR2)。这使得在编写查询时对它们的操作更难实现,并且在大型数据集上执行效率低。
Oracle 为您提供了两种数据类型,精确地用于您希望存储的数据库中的此类间隔记录。
INTERVAL
INTERVAL YEAR [(year_precision)] TO MONTH - 以年和月为单位存储一段时间
INTERVAL DAY [(day_precision)] TO SECOND [(fractional_seconds)] - 将一段时间存储在
天、小时、分钟和秒
第二种类型有助于您将所需的值存储为INTERVAL .. HOUR to MINUTE。
例如:- INTERVAL '07:30' HOUR TO MINUTE
因此,求和运算本来可以很简单,time_rent + time_expired,这可以使它更容易操作。现在,由于您已将它们存储为字符,Oracle 确实为您提供了救援功能:
TO_DSINTERVAL - TO_DSINTERVAL 将CHAR, VARCHAR2, NCHAR, or NVARCHAR2 数据类型的字符串转换为INTERVAL DAY TO SECOND。
因此,将 DAY 组件和秒组件(零)附加到您的时间列将有助于将它们转换为 INTERVAL 类型:TO_DSINTERVAL('000 '|| time_rent|| ':00')。
因此,您的最终查询将类似于。
WITH t
AS (SELECT t1.name,
TO_DSINTERVAL('000 '|| time_rent|| ':00')
+ TO_DSINTERVAL('000 '|| time_expired|| ':00') AS intv
FROM table1 t1
join table2 t2
ON t1.name = t2.name)
SELECT name,
EXTRACT(day FROM intv) * 24 + EXTRACT(hour FROM intv) --hours
|| ':'
|| EXTRACT(minute FROM intv) as duration -- minutes
FROM t;
由于加法运算使总时长超过24小时(26),默认情况下间隔将被视为1 day 2 hours。 EXTRACT 函数用于获取所需HH:MM 格式的o/p。您可以使用EXTRACT 函数从时间间隔(天.小时、分钟、秒...)中检索任何组件并修改查询以显示所需的格式。
Demo