2013-07-05 4 views
2

Я пытаюсь написать два оператора SQL. Первый будет отображаться между часами с 11:00 до 6:00, а второй будет показывать NOT между домом 11 вечера и 6 утра.Между временем в SQL

Я пытаюсь получить мою голову вокруг, когда я говорю НЕ между

WHERE TO_CHAR(MOPACTIVITY.MOPSTART, 'hh24:mi') NOT BETWEEN '23:00' AND '06:00' 

Я получаю записей между '23: 00' и '06: 00' . Это похоже на то, что я прошу в SQL. Что с этим?

+0

должен быть ГДЕ TO_CHAR (MOPACTIVITY.MOPSTART, 'hh24: mi') НЕ МЕЖДУ '06: 00 'И '23: 00' – Satya

+0

Является ли поведение МЕЖДУ X И Y документированным, где X больше Y? Если это так, я подозреваю, что это не то, чего вы ожидаете. –

+0

Предположительно 'NOT BETWEEN '23: 00 'AND '06: 00'' означает то же самое, что' NOT BETWEEN '06: 00' AND '23: 00'', что является полной противоположностью тому, что вы хотите. Я предлагаю сбросить 'NOT' и использовать порядок, который имеет смысл:' BETWEEN '06: 00 'AND '23: 00''. – ruakh

ответ

3

Одним из решений является использование 'SSSSS'format mask. Он показывает количество секунд после полуночи и отлично подходит для обработки времени независимо от элемента даты.

Между часов 06:00 до 23:00

select * from t23 
where to_number(to_char(some_date_coll, 'SSSSS')) is between (6*60*24) and (23*60*24); 

Между часами 23:00 и 06:00 в

select * from t23 
where to_number(to_char(some_date_coll, 'SSSSS')) < (6*60*24) 
    or to_number(to_char(some_date_coll, 'SSSSS')) > (23*60*24); 

Или использовать NOT BETWEEN с первым запросом ,

Я оставил арифметику в ее расширенной форме, потому что ее легче понять (и изменить), чем закодированные цифры секунд.

Здесь применяются обычные оговорки об эффекте воздействия функций обертки вокруг индексированных столбцов.

0

Я не уверен, что ваше использование «МЕЖДУ» - это то, что вы намерены. Меня беспокоит, что «между» является «включительно» обоих указанных значений. Обычно при фильтрации дат вам нужен открытый интервал, который не включает по крайней мере одну из границ.

В вашем вопросе, например, между вами будет получен/пропустить 06:00 и 23:00 минут. Это показано ниже, чтобы проиллюстрировать мою мысль.

Используя приведенный ниже раздел «Настройка тестовых данных», я создаю набор данных теста в кромке.

Вот вывод двух запросов:

Query для МЕЖДУ 06 и 23

select 
    m.mopstart 
from 
    mopactivity m 
where 1=1 
    and to_char(m.mopstart, 'HH24:MI') between '06:00' and '23:00' 
order by 
    m.mopstart 
; 

10-SEP-02 06.00.00.000000000 AM 
10-SEP-02 06.01.00.000000000 AM 
10-SEP-02 10.59.00.000000000 PM 
10-SEP-02 11.00.00.000000000 PM <-- Did you really want 23:00 record here? 

Query для NOT BETWEEN 06 и 23

select 
    m.mopstart 
from 
    mopactivity m 
where 1=1 
    and to_char(m.mopstart, 'HH24:MI') NOT between '06:00' and '23:00' 
order by 
    m.mopstart 
; 

10-SEP-02 12.00.00.000000000 AM 
10-SEP-02 05.59.00.000000000 AM 
10-SEP-02 11.01.00.000000000 PM 

Установка для Данные испытаний ::

drop table mopactivity 
; 

create table mopactivity 
(
    mopstart timestamp NOT NULL 
) 
; 

insert into mopactivity 
values( 
    TO_TIMESTAMP ('10-Sep-02 22:59', 'DD-Mon-RR HH24:MI') 
) 
; 
insert into mopactivity 
values( 
    TO_TIMESTAMP ('10-Sep-02 23:00', 'DD-Mon-RR HH24:MI') 
) 
; 
insert into mopactivity 
values( 
    TO_TIMESTAMP ('10-Sep-02 23:01', 'DD-Mon-RR HH24:MI') 
) 
; 
insert into mopactivity 
values( 
    TO_TIMESTAMP ('10-Sep-02 05:59', 'DD-Mon-RR HH24:MI') 
) 
; 
insert into mopactivity 
values( 
    TO_TIMESTAMP ('10-Sep-02 06:00', 'DD-Mon-RR HH24:MI') 
) 
; 
insert into mopactivity 
values( 
    TO_TIMESTAMP ('10-Sep-02 06:01', 'DD-Mon-RR HH24:MI') 
) 
; 
insert into mopactivity 
values( 
    TO_TIMESTAMP ('10-Sep-02 00:00', 'DD-Mon-RR HH24:MI') 
) 
; 

commit 
; 
0

код, который вы хотите:

WHERE TO_CHAR(MOPACTIVITY.MOPSTART, 'hh24:mi') BETWEEN 'o6:00' AND '23:00' 

и:

WHERE TO_CHAR(MOPACTIVITY.MOPSTART, 'hh24:mi') not BETWEEN '06:00' AND '23:00' 

between и not between операторы всегда предполагаем, что первая оценка меньше, чем вторая оценка.Так что ничего не соответствует:

where x between 2 and 1 

И все совпадает:

where x not between 2 and 1 

Другой способ написать это с час:

WHERE hour(MOPACTIVITY.MOPSTART) between 6 and 23 - 1 

Вторая:

where hour(MOPACTIVITY.MOPSTART) NOT BETWEEN 6 and 23 - 1 

Существует разница между usi ng hour() и ваша формулировка. Такие времена, как 23:00:10, соответствуют вашему времени на 6-23, но не соответствуют этой версии.

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