2015-07-23 2 views
0

Oracle таблицывыражение в статье о присоединении?

Следующий запрос работает как START_TIME_ и DT.LABEL_DATE_TIME_15MIN_INT выход той же монетой. Я должен признать, что это первый раз, когда я написал такое объединение, приемлемо или есть более эффективный/правильный способ достижения этого?

select 
    A.ID, 
    trunc(A.START_TIME,'dd') + (round(to_char(A.START_TIME,'sssss')/900)/96) as START_TIME_, 
    DT.LABEL_DATE_TIME_15MIN_INT 
from TBL_A A 
    inner join DATE_TIME DT 
    on ((trunc(A.IN_TIME_START,'dd') + (round(to_char(A.IN_TIME_START,'sssss')/900)/96)) = DT.DATE_TIME_15MIN_INT) 
order by A.ID; 

Причина подход: A.START_TIME является TIMESTAMP(6) GMT-5 DT таблицы имеет время Клавишу Epoch по Гринвичу с соответствующим «отформатирована этикеткой» скорректированной по Гринвичу-5. Вместо того, чтобы преобразовывать A.START_TIME в EPOCH, настраивая для часовой пояс и соединяясь с ключом, я выполнил арифметику до A до правильного 15-минутного интервала, затем присоединился к метке. Я пропустил очень простое решение здесь?

ответ

1

Я хотел бы пойти на более краткий подход:

SELECT 
    a.id, 
    a.start_time_, 
    dt.label_date_time_15min_int 
FROM 
    date_time dt 
     JOIN (
      SELECT 
       id, 
       TRUNC(in_time_start,'dd') + (ROUND(TO_CHAR(in_time_start,'sssss')/900)/96) AS in_time_start_, 
       TRUNC(start_time,'dd') + (ROUND(TO_CHAR(start_time,'sssss')/900)/96) AS start_time_ 
      FROM 
       tbl_a 
     ) a ON a.in_time_start_ = dt.date_time_15min_int 
ORDER BY 
    a.id 
; 

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

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