我有两个时间戳,例如'20 -Nov-2010 20:11:22'开始和结束。现在我想计算9:00到21:00之间的时间,即12小时。
输入将是两个日期,例如'10 -Nov-2010'和'20 -Nov-2010'start date
和end date
componentid starttime endtime result
3 13-Nov-2010 10:00:00 13-Nov-2010 21:00:00 11:00 hours
5 14-Nov-2010 09:30:00 14-Nov-2010 22:00:00 11:30 and
3 15-Nov-2010 08:20:00 15-Nov-2010 20:00:00 11:00 minutes
4 16-Nov-2010 08:00:00 16-Nov-2010 23:00:00 12:00
sum 45:30
现在,从示例中我只想知道从2010年11月10日到2010年11月20日这段时间的9:00到21:00之间的小时和分钟。我不知道如何在Oracle SQL中做到这一点 - 请您解释一下如何做到这一点?
答案 0 :(得分:1)
这是最后的总和
select
trunc(Mi/60) || ':' || right('0' || mod(Mi,60), 2) Total
from
(
select sum
(
(
case when endtime-trunc(endtime) > 21.0/24 then 21.0/24 else endtime-trunc(endtime) end
-
case when starttime-trunc(starttime) < 9.0/24 then 9.0/24 else starttime-trunc(starttime) end
) * 24 * 60
) Mi
from tbl
where starttime >= to_date('10-Nov-2010')
and endtime < to_date('20-Nov-2010') + 1
) M
答案 1 :(得分:0)
你将如何手工完成?
将其简化为SQL需要了解Oracle的时间操作函数 - 这是每个DBMS都有自己的一组特殊功能和规则的区域之一,并且在一个上运行的内容不一定适用于任何其他功能和规则。
答案 2 :(得分:0)
试试这个:
SELECT componentid,
starttime,
endtime,
(
CASE WHEN (endtime> TRUNC(endtime+ 21/24)) THEN TRUNC(endtime+ 21/24) ELSE endtime END -
CASE WHEN (starttime< TRUNC(endtime+ 9/24)) THEN TRUNC(starttime+ 9/24) ELSE starttime END
)*24 result
FROM <YOURTABLE>
答案 3 :(得分:0)
为了提供另一种做时间算术的方法,我将使用带间隔算术的视图。 (PostgreSQL,而不是Oracle。)
CREATE VIEW experimental_time_diffs AS
SELECT component_id, start_time, end_time,
case when cast(end_time as time) > '21:00'
then date_trunc('day', end_time) + interval '21' hour else end_time end -
case when cast(start_time as time) < '9:00'
then date_trunc('day', start_time) + interval '9' hour else start_time end
AS adj_elapsed_time
FROM your_table;
你可以对视图的列“adj_elapsed_time”求和。
select sum(adj_elapsed_time) as total_elapsed_time
from experimental_time_diffs;