SQL: поиск данных по диапазону дат - PullRequest
0 голосов
/ 18 мая 2018

У меня есть 2 записи с полями "from_date" и "to_date":

 - Record 1 : from_date=2017-05-15 and to_date=2017-06-12
 - Record 2 : from_date=2018-03-20 and to_date=2018-04-11

как получить запись 2, если поиск по дате:

 - 2018-03-01 and 2018-03-31?

или

 - 2018-04-01 and 2018-04-30?

или

 - 2018-04-01 and 2018-04-03?

Ответы [ 4 ]

0 голосов
/ 18 мая 2018

Спасибо всем за ваш ответ.Я нашел ответ.

WHERE ((from_date BETWEEN {fromDate} AND {toDate} OR to_date BETWEEN {fromDate} AND {toDate} OR (from_date <= {fromDate} AND to_date >= {fromDate}))

при использовании CakePHP3:

->where([
        'OR' => [
            function($exp) use($fromDate,$toDate){                            
                return $exp->between('from_date',$fromDate,$toDate,'date');
            },
            function($exp) use($fromDate,$toDate){                            
                return $exp->between('to_date',$fromDate,$toDate,'date');
            }, 
            'AND' => [
                'from_date <=' => $fromDate,
                'to_date >=' => $fromDate
            ]
        ],
        'from_date is not' => null
    ]);
0 голосов
/ 18 мая 2018

Попробуйте этот образец:

Declare @date1 Date
Declare @date2 Date

set @date1 = <<give your first date>> 'yyyy-dd-mm
set @date2 = <<give your second date>> 'yyyy-dd-mm

SELECT * FROM tbldate WHERE CONVERT(DATE,@date1) BETWEEN from_date and to_date OR CONVERT(DATE,@date2) BETWEEN from_date and to_date
0 голосов
/ 18 мая 2018

Пример оракула:

with 
    table1 as 
      ( select 1 id, to_date('2017-05-15','YYYY-MM-DD') date_from, to_date('2017-06-12','YYYY-MM-DD') date_to  from dual union all
        select 2 id, to_date('2018-03-20','YYYY-MM-DD') date_from, to_date('2018-04-11','YYYY-MM-DD') date_to  from dual )
select
    *
from 
    table1
where
/*
        to_date('2018-03-01','YYYY-MM-DD') < date_to
    and to_date('2018-03-31','YYYY-MM-DD') > date_from

        to_date('2018-04-01','YYYY-MM-DD') < date_to
    and to_date('2018-04-30','YYYY-MM-DD') > date_from
*/
        to_date('2018-04-01','YYYY-MM-DD') < date_to
    and to_date('2018-04-03','YYYY-MM-DD') > date_from
;
0 голосов
/ 18 мая 2018

Это так же просто, как:

SELECT * 
   FROM records 
    WHERE from_date >= @from_date 
         OR to_date <= @to_date 

Где @from_date и @to_date только ваши переменные.

Я использовал OR, так как вы не ищете инклюзивный диапазон.Это просто частичное совпадение.

Вы хотите условие, которое соответствует этой записи from_date=2018-03-20 и to_date=2018-04-11

Давайте рассмотрим условие на основе WHERE from_date >= @from_date OR to_date <= @to_date

@from_date = 2018-03-01 --false
@to_date   = 2018-03-31 --true
--
@from_date = 2018-04-01 --true
@to_date   = 2018-04-30 --false
--
@from_date = 2018-04-01 --true
@to_date   = 2018-04-03 --true

Это показывает, что вы толькотребуется соответствие одной из границ.

Обратите внимание, что в зависимости от СУБД сравнение дат может отличаться, но логика остается той же.

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