Запрос Current_Timestamp между временем начала и окончания (без даты!) Oracle PL / SQL - PullRequest
1 голос
/ 06 декабря 2011

У меня есть время (без компонента даты), например, 9 утра, допустим, это текущее время. Я хочу запросить все записи из таблицы, где это время находится между временем начала и конца, сохраненным как метка времени.

Как мне это сделать? Должен ли я хранить его по-другому?

Я пробовал что-то вроде SELECT * FROM tab1 WHERE (current_timestamp - current_date) BETWEEN starttime AND endtime;, но это не работает, потому что вычисленная разница всегда (почти) равна нулю. Я мог бы что-то сделать с командой EXTRACT, но это кажется немного сложным ... Разве нет простого способа сделать это?

По сути, это сохраненные встречи.

Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 06 декабря 2011

Попробуйте:

SELECT * FROM tab1 
WHERE (current_timestamp - TRUNC(current_date)) BETWEEN starttime AND endtime
2 голосов
/ 06 декабря 2011

это два варианта, и мне извлечение не кажется сложным

where 16 between extract(hour from start_ts) and extract(hour from end_ts)
where '16' between to_char(start_ts, 'hh24') and to_char(end_ts, 'hh24')

Обратите внимание, что если вы поместите обычный индекс в (start_ts, and_ts), то этот запрос не будет использовать его, вместо этого он будет сканировать полную таблицу. Вам потребуется индекс на основе функций, чтобы избежать полного сканирования таблицы http://www.dba -oracle.com / t_garmany_easysql_function_based_indexes_fbi.htm

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

where to_timestamp('2011.12.06. 17', 'yyyy.mm.dd. hh24') between start_ts and end_ts

Конечно, четвертый вариант будет хранить непосредственно часы начала и окончания вместо значений меток времени.

вот код, с которым я их проверял

select * from 
(select
1 as id,
to_timestamp('2011.12.06. 16:10:32', 'yyyy.mm.dd. hh24:mi:ss') as start_ts, 
to_timestamp('2011.12.06. 16:18:32', 'yyyy.mm.dd. hh24:mi:ss') as end_ts
from dual
union
select 
2 as id,
to_timestamp('2011.12.06. 16:20:32', 'yyyy.mm.dd. hh24:mi:ss') as start_ts, 
to_timestamp('2011.12.06. 17:18:32', 'yyyy.mm.dd. hh24:mi:ss') as end_ts
from dual
union
select 
3 as id,
to_timestamp('2011.12.06. 17:30:32', 'yyyy.mm.dd. hh24:mi:ss') as start_ts, 
to_timestamp('2011.12.06. 18:18:32', 'yyyy.mm.dd. hh24:mi:ss') as end_ts
from dual
)
where 16 between extract(hour from start_ts) and extract(hour from end_ts)
--where '16' between to_char(start_ts, 'hh24') and to_char(end_ts, 'hh24')
--where to_timestamp('2011.12.06. 17', 'yyyy.mm.dd. hh24') between start_ts and end_ts
;
0 голосов
/ 06 декабря 2011

Функция to_char всегда полезна, когда речь идет о сравнении дат. Если вы хотите сравнить только временную составляющую временной отметки, используйте

to_char(your_time, 'hh24mm')
...