2015-03-20 6 views
1
A Table named TRADES has the following structure and Data: 

    CREATE TABLE trades (
     trade_id    NUMBER, 
     trade_execution_tmstmp TIMESTAMP(6), 
     time_zone_name   VARCHAR2 (30 BYTE), 
     last_trade_marker  TIMESTAMP(6) 
); 

enter image description hereПреобразования Timestamp из одного часового пояса в другой

trade_id -- Unique ID for every trade 

trade_execution_tmstmp - время, когда торговля была выполнена в EST time_zone_name - местный часовой пояс для торговли last_trade_marker - время в EST для последняя сделка за определенный день

Требование выглядит следующим образом: Мне нужно разработать процедуру, которая вставляет следующий день в другую таблицу next_day_trades.

Если процедура запущена 2 января (в данном случае), будет торговля только 1 на следующий день с trade_id = 4. Итак, таблица next_day_trades будет иметь 1 запись.

Логика принятия решения о сделке на следующий день следующая: trade_execution_tmstmp находится в EST. Он должен быть преобразован в местную временную метку, чтобы увидеть, когда торговля была фактически выполнена на местном рынке. В этом случае Австралия/Сидней для всех сделок. last_trade_marker - это время последней торговли на этом рынке.

Ниже приводится описание 3-й и 4-й записей в таблице.

Торговля 3 выполнена на уровне «1/2/2015 1: 00: 00.000000 PM» (EST). Его эквивалент Австралии/Сиднее будет «1/3/2015 4: 00: 00.000000 AM» Последняя торговая марка за 2 января - «1/3/2015 2: 00: 00.000000 AM» Если сделка выполнена с 12:00 до 02:00 (последний торговый маркер), это будет торговля на следующий день. Итак, торговля 3 не является сделкой на следующий день.

Торговля 4 выполнена в '1/2/2015 10: 00: 00.000000 AM' (EST). Его эквивалент Австралии/Сиднее будет «1/3/2015 1: 00: 00.000000 AM» Последняя торговая марка для 2 января - «1/3/2015 2: 00: 00.000000 AM» Если сделка выполнена с 12:00 до 02:00 (последний торговый маркер), это будет торговля на следующий день. Итак, торговля 4 - это торговля на следующий день.

Примечание: На следующий день торги должны быть включены только для дня исполнения Хранимого Прока. Вот почему в таблицу next_day_trades вставляется только торговля 4, а не торговля 2, если Proc запущен 2 января.

Пожалуйста, помогите мне при поиске запроса SELECT для вставок.

+0

Что означает «последний маркер торговли»? почему вы принимаете особенно 12-2.00 AM период? –

+0

Последняя торговая марка - последний момент для торговли, которая будет включена для сегодняшней торговли. Я занимаю 12 - LTM, так как это деловая необходимость. Я также могу заменить это условие на trade_execution_tmstmp

ответ

2

Вы можете конвертировать EST в указанный часовой пояс в два этапа; сначала объявив, в каком часовом поясе находятся исходные значения, с from_tz(), а затем с помощью оператора преобразования at time zone.

Вам необходимо преобразовать последний торговый маркер в метку времени с часовым поясом, а также потому, что вам также нужно заманить в ловушку начало этого дня (для вашего диапазона 00: 00-02: 00), вам нужно усечь это - что делает его датой - до применения from_tz() к этому.

select trade_id, trade_execution_tmstmp, time_zone_name, last_trade_marker, 
    from_tz(trade_execution_tmstmp, 'EST') at time zone time_zone_name 
    as trade_execution_local_tmstmp, 
    from_tz(cast(trunc(last_trade_marker) as timestamp), time_zone_name) 
    as last_trade_marker_start, 
    from_tz(last_trade_marker, time_zone_name) as last_trade_marker_end 
from trades; 

С сессией измененной форматировать значения немного по-другому:

alter session set NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS'; 
alter session set NLS_TIMESTAMP_TZ_FORMAT = 'YYYY-MM-DD HH24:MI:SS TZR'; 

Это получает:

TRADE_ID TRADE_EXECUTION_TMSTM TIME_ZONE_NAME LAST_TRADE_MARKER  TRADE_EXECUTION_LOCAL_TMSTMP   LAST_TRADE_MARKER_START    LAST_TRADE_MARKER_END    
---------- --------------------- ---------------- --------------------- ------------------------------------ ------------------------------------ ------------------------------------ 
     1 2015-01-01 13:00:00 Australia/Sydney 2015-01-02 02:00:00 2015-01-02 05:00:00 AUSTRALIA/SYDNEY 2015-01-02 00:00:00 AUSTRALIA/SYDNEY 2015-01-02 02:00:00 AUSTRALIA/SYDNEY 
     2 2015-01-01 10:00:00 Australia/Sydney 2015-01-02 02:00:00 2015-01-02 02:00:00 AUSTRALIA/SYDNEY 2015-01-02 00:00:00 AUSTRALIA/SYDNEY 2015-01-02 02:00:00 AUSTRALIA/SYDNEY 
     3 2015-01-02 13:00:00 Australia/Sydney 2015-01-03 02:00:00 2015-01-03 05:00:00 AUSTRALIA/SYDNEY 2015-01-03 00:00:00 AUSTRALIA/SYDNEY 2015-01-03 02:00:00 AUSTRALIA/SYDNEY 
     4 2015-01-02 10:00:00 Australia/Sydney 2015-01-03 02:00:00 2015-01-03 02:00:00 AUSTRALIA/SYDNEY 2015-01-03 00:00:00 AUSTRALIA/SYDNEY 2015-01-03 02:00:00 AUSTRALIA/SYDNEY 

Вы можете сравнить эти скорректированные значения столбцов, чтобы решить, должен ли он быть на следующий день в соответствии с правилами, которые я их понимаю:

select trade_id, trade_execution_tmstmp, time_zone_name, last_trade_marker, 
    case when from_tz(trade_execution_tmstmp, 'EST') at time zone time_zone_name 
    between from_tz(cast(trunc(last_trade_marker) as timestamp), time_zone_name) 
     and from_tz(last_trade_marker, time_zone_name) 
    then 'Yes' else 'No' end as next_day_trade 
from trades; 

    TRADE_ID TRADE_EXECUTION_TMSTM TIME_ZONE_NAME LAST_TRADE_MARKER  NEXT_DAY_TRADE 
---------- --------------------- ---------------- --------------------- -------------- 
     1 2015-01-01 13:00:00 Australia/Sydney 2015-01-02 02:00:00 No    
     2 2015-01-01 10:00:00 Australia/Sydney 2015-01-02 02:00:00 Yes   
     3 2015-01-02 13:00:00 Australia/Sydney 2015-01-03 02:00:00 No    
     4 2015-01-02 10:00:00 Australia/Sydney 2015-01-03 02:00:00 Yes   

«Между» может быть не правильным выбором здесь; зависит от того, будет ли торговля на ровно 02: 00: 00.0 подсчитана на следующий день. Возможно, вам понадобится эквивалент

trade_execution_local_tmstmp >= last_trade_marker_start 
and trade_execution_local_tmstmp < last_trade_marker_end 

В любом случае вы можете использовать это же условие, чтобы решить, какие строки копировать в вашу отдельную таблицу.

Смежные вопросы