Есть ли способ показать вам примерную базу данных?
Вы можете использовать dbfiddle.uk для создания тестовых таблиц и запросов.Предположим, у вас есть следующая тестовая таблица (называемая ORIGINAL) и данные:
Таблица
create table original (
jddate number
, starttime timestamp
, endtime timestamp
, nr number
, terminal varchar2( 100 )
, dep varchar2( 100 )
, doc number
, typ number
, key1 number
, key2 number
) ;
INSERTs
insert into original
select 118001
, trunc( sysdate ) + ( 6/24 ) + ( 30/(24*60 ) )
, trunc( sysdate ) + (86399/86400)
, 34000001, 'MM01X11', 'XX01', 1000800001, 1, 99000000, 99000000 from dual union all
-- duplicate
select 118001
, trunc( sysdate ) + ( 6/24 ) + ( 30/(24*60 ) )
, trunc( sysdate ) + (86399/86400)
, 34000001, 'MM01X11', 'XX01', 1000800001, 1, 99000000, 99111111 from dual union all
select 118001
, trunc( sysdate ) + ( 6/24 ) + ( 30/(24*60 ) )
, trunc( sysdate ) + (86399/86400)
, 34000001, 'MM01X11', 'XX01', 1000800001, 1, 99000000, 99111111 from dual union all
--
select 118001
, trunc( sysdate ) + ( 6/24 ) + ( 30/(24*60 ) )
, trunc( sysdate ) + (86399/86400)
, 34000001, 'MM01X11', 'XX01', 1000800001, 2, 99000000, 99000000 from dual union all
select 118001
, trunc( sysdate ) + ( 6/24 ) + ( 30/(24*60 ) )
, trunc( sysdate ) + (86399/86400)
, 34000001, 'MM01X11', 'XX01', 1000800001, 3, 99000000, 99000000 from dual union all
select 118001
, trunc( sysdate ) + ( 6/24 ) + ( 30/(24*60 ) )
, trunc( sysdate ) + (86399/86400)
, 34000001, 'MM01X11', 'XX01', 1000800001, 4, 99000000, 99000000 from dual ;
SELECT
-- select * from original;
JDDATE STARTTIME ENDTIME NR TERMINAL DEP DOC TYP KEY1 KEY2
118001 15-DEC-18 06.30.00.000000000 15-DEC-18 23.59.59.000000000 34000001 MM01X11 XX01 1000800001 1 99000000 99000000
118001 15-DEC-18 06.30.00.000000000 15-DEC-18 23.59.59.000000000 34000001 MM01X11 XX01 1000800001 1 99000000 99111111
118001 15-DEC-18 06.30.00.000000000 15-DEC-18 23.59.59.000000000 34000001 MM01X11 XX01 1000800001 1 99000000 99111111
118001 15-DEC-18 06.30.00.000000000 15-DEC-18 23.59.59.000000000 34000001 MM01X11 XX01 1000800001 2 99000000 99000000
118001 15-DEC-18 06.30.00.000000000 15-DEC-18 23.59.59.000000000 34000001 MM01X11 XX01 1000800001 3 99000000 99000000
118001 15-DEC-18 06.30.00.000000000 15-DEC-18 23.59.59.000000000 34000001 MM01X11 XX01 1000800001 4 99000000 99000000
Требования
{1} Сначала мне нужны все значения с "Typ" = 1 и JDDate => 118000
{2} Затем мне нужна разница / временной шаг между START и ENDоснованный на правильном JDDate / Format.К сожалению, вот некоторые дубликаты, основанные на JDDate, START;КОНЕЦ;Terminal.:
{3} И, по крайней мере, у меня есть некоторые устаревшие данные / дубликаты в Key1 и Key2.Таким образом, Key1 содержит каждый раз число.Key2 содержит либо 0, либо число, которое также является номером в Key1.Если в Key1 и Key2 одно и то же число, обе строки должны быть удалены.
Пример запроса - в качестве отправной точки (для предложения WHERE потребуется дополнительная работа ...)
select distinct -- {2} remove duplicates
jddate
, endtime - starttime as interval_ -- {2}
, nr
, terminal
, dep
, doc
, typ
, key1
, key2
from original
where typ = 1 and jddate > 118000 -- {1}
and key1 <> key2 -- {3}
;
-- result
JDDATE INTERVAL_ NR TERMINAL DEP DOC TYP KEY1 KEY2
118001 +00 17:29:59.000000 34000001 MM01X11 XX01 1000800001 1 99000000 99111111
Для преобразования значений в столбце JDDATE в Oracle DATE вы можете создать небольшую функцию, используя код ответа , который вы получили ранее.(Вам не нужно, но это уберет некоторый «беспорядок» из ваших SELECT), например,
-- /12111543/sql-data-zhylena-cyyddd-do-daty
/*
select date '1900-01-01'
+ floor(118001 / 1000) * interval '1' year
+ (mod(118001, 1000) - 1) * interval '1' day
from dual;
*/
-- this is far from perfect, needs range checking, exception handling etc
create or replace function cyyddd_to_date ( cyyddd number ) return date
is
begin
return
date '1900-01-01'
+ floor( cyyddd / 1000 ) * interval '1' year
+ ( mod( cyyddd, 1000 ) - 1 ) * interval '1' day
;
end;
/
-- quick test
select
cyyddd_to_date( 118001 ) date_
, to_char( cyyddd_to_date( 118001 ), 'YYYY-MM-DD' ) datetime_
from dual;
-- result
DATE_ DATETIME_
01-JAN-18 2018-01-01
Окончательный запрос
select distinct -- {2} remove duplicates
to_char( cyyddd_to_date( jddate ), 'YYYY-MM-DD' ) date_
, endtime - starttime interval_ -- {2}
, nr
, terminal
, dep
, doc
, typ
, key1
, key2
from original
where typ = 1 and jddate > 118000 -- {1}
and key1 <> key2 -- {3}
;
-- result
DATE_ INTERVAL_ NR TERMINAL DEP DOC TYP KEY1 KEY2
2018-01-01 +00 17:29:59.000000 34000001 MM01X11 XX01 1000800001 1 99000000 99111111
Протестировано с Oracle 12c и Oracle 11g, dbfiddle здесь .