Как получить только время с 9:00 до 21:00 между двумя датами - PullRequest
1 голос
/ 13 января 2011

У меня есть две метки времени, например, '20 -Nov-2010 20:11:22 'начался и закончился.Теперь я хочу рассчитать время с 9:00 до 21:00, которое составляет 12 часов.

В качестве входных данных будут использоваться две даты, такие как «10-ноя-2010» и «20-ноя-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

Теперь из примеров я хочу только часы и минуты между 9:00 и 21:00, то есть временем, которое наступает в этом диапазоне с 10 ноября 2010 г. по 20 ноября.-2010.Я не знаю, как это сделать в Oracle SQL - не могли бы вы объяснить, как это сделать?

Ответы [ 4 ]

1 голос
/ 13 января 2011

Это на окончательную сумму

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
0 голосов
/ 14 января 2011

В целях обеспечения еще одного способа выполнения арифметики времени я буду использовать представление с интервальной арифметикой.(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;
0 голосов
/ 13 января 2011

Попробуйте это:

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>
0 голосов
/ 13 января 2011

Как бы вы сделали это вручную?

  • Вам необходимо определить минимальное (более раннее) время окончания дня и 21:00 дня, чтобы установить конечную точку.
  • Вам нужно определить максимальное (позднее) время начала дня и 09:00 дня, чтобы установить начальную точку.
  • Разница между этими двумя значениями - это время, которое выwant.

Чтобы свести это к SQL, требуется знание функций манипулирования временем для Oracle - это одна из областей, где каждая СУБД имеет свой собственный набор уникальных функций и правил и то, что работает на одномне обязательно будет работать на любом другом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...