2014-11-19 4 views
1

Я работаю над запросом, который извлекает информацию об открытии магазина и времени закрытия. Это ResultSet:SQL получить количество часов в предыдущих строках

RTL_LOC_ID TRANS_TYPCODE     BEGIN_DATETIME    
---------- ------------------------------ --------------------------- 
     2390 WORKSTATION_OPEN    14.10.01 09:53:43,121000000 
     2390 WORKSTATION_CLOSE    14.10.01 23:51:49,729000000 
     2390 WORKSTATION_OPEN    14.10.02 09:57:47,768000000 
     2390 WORKSTATION_CLOSE    14.10.02 23:47:00,120000000 
     2390 WORKSTATION_OPEN    14.10.03 09:47:38,949000000 
     2390 WORKSTATION_CLOSE    14.10.03 23:45:42,602000000 

6 рядов выбран

Это запрос:

SELECT RTL_LOC_ID,TRANS_TYPCODE, BEGIN_DATETIME 
FROM TRN_TRANS 
WHERE(trans_typcode = 'WORKSTATION_OPEN' OR trans_typcode='WORKSTATION_CLOSE') 
AND BUSINESS_DATE BETWEEN '14.10.01 00:00:00' AND '14.10.03 00:00:00' 
ORDER BY BUSINESS_DATE, BEGIN_DATETIME ASC; 

Так что нужно рассчитать количество часов между открытием и закрытием магазина и места это значение в новый столбец. Я также хотел бы поставить результат за день в одной строке вместо двух отдельных строк за каждый день.

Благодаря

ответ

0

Этот ответ предполагает MySQL поскольку вопрос не был помечен с Oracle, чтобы начать с. Я оставляю этот ответ здесь, так как это может вдохновить кого-то с навыками Oracle в направлении решения ...

Предполагая, что местоположение всегда открывает перед закрытием, быстрый и грязный раствор может выглядеть следующим образом:

SELECT RTL_LOC_ID, DATE(BUSINESS_DATE), 
    MIN(BUSINESS_DATE) AS [OpenTime], 
    MAX(BUSINESS_DATE) AS [CloseTime] 
FROM 
    TRN_TRANS 
WHERE(trans_typcode = 'WORKSTATION_OPEN' OR trans_typcode='WORKSTATION_CLOSE') 
AND BUSINESS_DATE BETWEEN '14.10.01 00:00:00' AND '14.10.03 00:00:00' 
GROUP BY RTL_LOC_ID, DATE(BUSINESS_DATE) 
ORDER BY DATE(BUSINESS_DATE) 

Или, если вы хотите быть педантичным:

SELECT RTL_LOC_ID, DATE(BUSINESS_DATE), 
    MAX(CASE trans_typcode WHEN 'WORKSTATION_OPEN' THEN BUSINESS_DATE ELSE NULL END) AS [OpenTime], 
    MAX(CASE trans_typcode WHEN 'WORKSTATION_CLOSE' THEN BUSINESS_DATE ELSE NULL END) AS [CloseTime], 
FROM 
    -- rest of query same as above -- 
+0

Hello Dan. Попытка выполнить ваш запрос приводит к следующей ошибке SQL: Ошибка SQL: ORA-00923: palavra chave FROM não foi encontrada onde se esperava 00923. 00000 - «Ключевое слово FROM не найдено, где ожидалось» * Причина: * Действие: – user3683958

+0

Вы не указали, что используете Oracle. Вы должны добавить тег oracle в свой вопрос. Я предположил MySql, так как у вас был тег mysqli ... – Dan

+0

Извините, Dan вы правы. Я работаю с Oracle SQL Developer. Добавлен тег Теперь – user3683958

0

это то, что вы имеете в виду?

SELECT 
TRN_TRANS.RTL_LOC_ID, 
DATE_FORMAT(BEGIN_DATETIME ,'%Y-%m-%d') AS _date, 
TIMEDIFF(closing_time.BEGIN_DATETIME , opening_time.BEGIN_DATETIME) AS _hours 
FROM TRN_TRANS 

INNER JOIN 
    (
     SELECT RTL_LOC_ID, BEGIN_DATETIME, DATE_FORMAT(BEGIN_DATETIME ,'%Y-%m-%d') as _date 
     FROM TRN_TRANS 
     WHERE TRANS_TYPCODE = 'WORKSTATION_OPEN' 
    ) AS opening_time 
ON 
TRN_TRANS.RTL_LOC_ID = opening_time.RTL_LOC_ID 
AND 
DATE_FORMAT(TRN_TRANS.BEGIN_DATETIME ,'%Y-%m-%d') = opening_time._date 


INNER JOIN 
     (
      SELECT RTL_LOC_ID, BEGIN_DATETIME, DATE_FORMAT(BEGIN_DATETIME ,'%Y-%m-%d') as _date 
      FROM TRN_TRANS 
      WHERE TRANS_TYPCODE = 'WORKSTATION_CLOSE' 
     ) AS closing_time 
ON 
TRN_TRANS.RTL_LOC_ID = closing_time.RTL_LOC_ID 
AND 
DATE_FORMAT(TRN_TRANS.BEGIN_DATETIME ,'%Y-%m-%d') = closing_time._date 

GROUP BY TRN_TRANS.RTL_LOC_ID, _date, _hours 
+0

Попытка выполнить запрос выдает следующее сообщение об ошибке SQL: Сообщение об ошибке - Ошибка SQL: ORA-00905: Falta palavra Chave 00905. 00000 - "отсутствует ключевое слово" * Причина: * Действие: – user3683958

+0

Ну я Извините, но я мало знаю об Oracle. Понятие этого запроса работает. Я протестировал его и дал результат в форме: 2390, 14.10.01, 11:20:39; 2390, 14.10.02, 08:03:45 и так далее. Он группируется по id и дате. Я надеюсь, что кто-то может помочь вам в преобразовании его в Oracle или имеет другое/лучшее решение. Удачи! Извините, я не могу больше помочь. – Eddy

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