Запрос Oracle для получения данных между определенным временем - PullRequest
0 голосов
/ 10 октября 2018

Мы пытаемся выяснить транзакции, совершенные в период с 00 до 03 утра за весь год.

Пробные функции extract и to_date со многими изменениями, но не могут получить точный результат.

Ниже приведены данные только за текущий месяц, даже если дата не указана

and TXNDATE >= to_date('00:00:00', 'HH24:MI:SS')
and TXNDATE <= to_date('03:30:00','HH24:MI:SS')

Пожалуйста, помогите.

Ответы [ 3 ]

0 голосов
/ 10 октября 2018

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

WHERE to_char(tnxdate, 'HH24:MI:SS') between '00:00:00' and '03:30:00'
0 голосов
/ 10 октября 2018

Вы можете сделать это, используя 'EXTRACT', но вы должны быть осторожны с правильным кодированием граничных условий.Вот пример:

WITH cteTxndates AS (SELECT TO_DATE('01-JAN-2018 00:00:00', 'DD-MON-YYYY HH24:MI:SS') AS TXNDATE FROM DUAL UNION ALL  -- *
                     SELECT TO_DATE('01-JAN-2018 00:00:01', 'DD-MON-YYYY HH24:MI:SS') AS TXNDATE FROM DUAL UNION ALL  -- *
                     SELECT TO_DATE('05-FEB-2018 00:01:01', 'DD-MON-YYYY HH24:MI:SS') AS TXNDATE FROM DUAL UNION ALL  -- *
                     SELECT TO_DATE('10-MAR-2018 00:10:01', 'DD-MON-YYYY HH24:MI:SS') AS TXNDATE FROM DUAL UNION ALL  -- *
                     SELECT TO_DATE('15-MAR-2018 01:00:01', 'DD-MON-YYYY HH24:MI:SS') AS TXNDATE FROM DUAL UNION ALL  -- *
                     SELECT TO_DATE('20-APR-2018 10:00:01', 'DD-MON-YYYY HH24:MI:SS') AS TXNDATE FROM DUAL UNION ALL  -- 
                     SELECT TO_DATE('25-MAY-2018 02:00:01', 'DD-MON-YYYY HH24:MI:SS') AS TXNDATE FROM DUAL UNION ALL  -- *
                     SELECT TO_DATE('30-JUN-2018 03:00:01', 'DD-MON-YYYY HH24:MI:SS') AS TXNDATE FROM DUAL UNION ALL  -- *
                     SELECT TO_DATE('02-JUL-2018 10:00:01', 'DD-MON-YYYY HH24:MI:SS') AS TXNDATE FROM DUAL UNION ALL  -- 
                     SELECT TO_DATE('20-AUG-2018 01:00:01', 'DD-MON-YYYY HH24:MI:SS') AS TXNDATE FROM DUAL UNION ALL  -- *
                     SELECT TO_DATE('03-SEP-2018 02:30:01', 'DD-MON-YYYY HH24:MI:SS') AS TXNDATE FROM DUAL UNION ALL  -- *
                     SELECT TO_DATE('30-OCT-2018 03:30:00', 'DD-MON-YYYY HH24:MI:SS') AS TXNDATE FROM DUAL UNION ALL  -- *
                     SELECT TO_DATE('30-OCT-2018 03:30:01', 'DD-MON-YYYY HH24:MI:SS') AS TXNDATE FROM DUAL UNION ALL  -- 
                     SELECT TO_DATE('04-NOV-2018 02:22:01', 'DD-MON-YYYY HH24:MI:SS') AS TXNDATE FROM DUAL UNION ALL  -- *
                     SELECT TO_DATE('14-DEC-2018 01:11:01', 'DD-MON-YYYY HH24:MI:SS') AS TXNDATE FROM DUAL),          -- *
     cteDatefields AS (SELECT TXNDATE,
                              EXTRACT(HOUR FROM CAST(TXNDATE AS TIMESTAMP)) AS XHOUR,
                              EXTRACT(MINUTE FROM CAST(TXNDATE AS TIMESTAMP)) AS XMINUTE,
                              EXTRACT(SECOND FROM CAST(TXNDATE AS TIMESTAMP)) AS XSECOND
                         FROM cteTxndates)
SELECT *
  FROM cteDatefields
  WHERE XHOUR >= 0 AND
        ( XHOUR < 3 OR
         (XHOUR = 3 AND XMINUTE < 30) OR
         (XHOUR = 3 AND XMINUTE = 30 AND XSECOND = 0));

dbfiddle здесь

0 голосов
/ 10 октября 2018

Как насчет простого извлечения часа?

and extract(hour from TXNDATE) < 3

Если вы хотите обрабатывать время напрямую, лучшим подходом могут быть строки:

to_char(txndate, 'HH24:MI:SS') >= '00:00:00' and
to_char(txndate, 'HH24:MI:SS') < '03:00:00'

Если производительность является проблемой иесли вы хотите использовать индекс, вы можете создать индекс, включающий to_char(txndate, 'HH24:MI:SS').

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