Проверить, находится ли текущая дата между двумя датами Oracle SQL

Я хотел бы выбрать 1, если текущая дата находится между двумя датами через Oracle SQL.

Я написал SQL после прочтения других вопросов.

https://stackoverflow.com/questions/2369222/oracle-date-between-query

https://stackoverflow.com/questions/2399753/select-from-table-by-knowing-only-date-without-time-oracle

Но он вернул только null. sysdate - текущая дата, которая равна 01/05/2014 в формате даты DD/MM/YYYY.

Я написал следующий SQL:

select 1 from dual 
WHERE to_date(sysdate,'DD/MM/YYYY') 
BETWEEN TO_DATE('28/02/2014', 'DD/MM/YYYY')
AND TO_DATE('20/06/2014', 'DD/MM/YYYY');

а также

select 1 from dual 
WHERE to_date(sysdate,'DD/MM/YYYY') >= TO_DATE('28/02/2014', 'DD/MM/YYYY') 
AND to_date(sysdate,'DD/MM/YYYY') < TO_DATE('20/06/2014', 'DD/MM/YYYY'); 

person Avinesh Kumar    schedule 30.04.2014    source источник
comment
вам нужно TO_DATE() sysdate? Наверняка это уже свидание   -  person paul    schedule 01.05.2014
comment
спасибо, paul, согласно Решение Гордона Линоффа ниже sysdate уже является датой.   -  person Avinesh Kumar    schedule 01.05.2014
comment
Для этого вам не нужен SQL - в PL / SQL вы можете просто сделать что-то вроде if sysdate between date '2014-02-28' and date '2014-06-21' then v := 1; end if;   -  person Jeffrey Kemp    schedule 01.05.2014
comment
спасибо, Джеффри Кемп, это тоже отлично работает для меня.   -  person Avinesh Kumar    schedule 01.05.2014


Ответы (3)


Вам не нужно применять to_date() к sysdate. Это уже есть:

select 1
from dual 
WHERE sysdate BETWEEN TO_DATE('28/02/2014', 'DD/MM/YYYY') AND TO_DATE('20/06/2014', 'DD/MM/YYYY');

Если вас беспокоит компонент времени в дате, используйте trunc():

select 1
from dual 
WHERE trunc(sysdate) BETWEEN TO_DATE('28/02/2014', 'DD/MM/YYYY') AND
                             TO_DATE('20/06/2014', 'DD/MM/YYYY');
person Gordon Linoff    schedule 30.04.2014
comment
trunc(sysdate) в этом примере (двойная таблица) подходит для обработки временной части даты, но в реальной таблице с индексированным полем DATE это может помешать Oracle использовать соответствующий индекс. Я бы посоветовал не использовать предложение between, а использовать здесь операторы сравнения: where DATE_FIELD >= TO_DATE('28/02/2014', 'DD/MM/YYYY') and DATE_FIELD < TO_DATE('20/06/2014', 'DD/MM/YYYY') + 1 - person anilech; 27.06.2018
comment
@ Аба. . . Я что-то упускаю? В этом вопросе нет order_date и нет указателя по дуалу. - person Gordon Linoff; 20.09.2019
comment
@GordonLinoff Я просто комментировал проблему trunc () и индексов, которую Anilech обнаружил, когда, как он указал, при работе с реальной таблицей. - person Aba; 20.09.2019

TSQL: Dates - нужно искать пробелы в датах между двумя датами

select
distinct
e1.enddate,
e3.startdate,
DATEDIFF(DAY,e1.enddate,e3.startdate)-1 as [Datediff]
from #temp e1 
   join #temp e3 on e1.enddate < e3.startdate          
       /* Finds the next start Time */
and e3.startdate = (select min(startdate) from #temp e5
where e5.startdate > e1.enddate)
and not exists (select *  /* Eliminates e1 rows if it is overlapped */
from #temp e5 
where e5.startdate < e1.enddate and e5.enddate > e1.enddate);
person user6341745    schedule 19.07.2018

person    schedule
comment
Как правило, ответы гораздо более полезны, если они включают объяснение того, для чего предназначен код, и почему это решает проблему, не вводя других. (Это сообщение было отмечено как минимум одним пользователем, предположительно потому, что они считали, что ответ без объяснения причин должен быть удален.) - person Nathan Tuggy; 24.05.2015
comment
Это работает как шарм. Просто нужно понимать форматирование с помощью to_date. - person Abhishek; 24.08.2018