2015-04-30 3 views
0

Я прочел темы и искал другой форум, но не повезло.mysql date compare not working

У меня есть две таблицы, AYEAR и график, как показано здесь

AYEAR

ay Block Block_start_date Block_end_date 
1213 4 2012-07-09   2013-05-13 
1314 4 2013-07-01   2014-05-09 
1415 4 2014-06-23   2015-05-08 
1516 4 2015-07-06   2016-05-09 
1617 4 2016-04-11   2017-05-01 

ГРАФИК

scheduleid sched_start_date sched_end_date 

59576370  2016-04-11  2016-05-06 
... 
... 
... 

Моя запланированное событие между 2016-04-11 и 2016-05-06. Я хочу знать, какой из этих периодов приходится на этот таймфрейм.

Я бегу следующий запрос

Select ay, scheduleid, sched_start_date, sched_end_date 

from schedule, ayear o 

where scheduleid = 59576370 

and block = 4 

and sched_start_date >= (select max(block_start_date) 
            from ayear i 
            where i.block= o.block 
            and sched_start_date >= i.block_start_date 
            and sched_end_date <= i.block_end_date 
            ) 

and sched_end_date <= (select max(block_end_date) 
            from ayear i 
            where i.block= o.block 
            and sched_start_date >= i.block_start_date 
            and sched_end_date <= i.block_end_date 
            ) 

Это дает мне это:

ay sched  sched_start_date sched_end_date block_start_date block_end_dt 

1213 59576370 2016-04-11  2016-05-06  2012-07-09  2013-05-13  
1314 59576370 2016-04-11  2016-05-06  2013-07-01  2014-05-09  
1415 59576370 2016-04-11  2016-05-06  2014-06-23  2015-05-08  
1516 59576370 2016-04-11  2016-05-06  2015-07-06  2016-05-09  
1617 59576370 2016-04-11  2016-05-06  2016-04-11  2017-05-01  

Когда я ожидаю получить только последнюю строку.

Все поля даты в обеих таблицах определяются как даты.

Я думаю, мой вопрос в том, как мне определить перекрывающиеся диапазоны времени?

+0

Моя запланированное событие между 4/11/16 и 5/6/16. Я хочу знать, какой из этих периодов приходится на этот таймфрейм. – alex

+0

Вы правы, но почему бы не отфильтровать, где block_start_date и block_end_date выходят за пределы sched_start_date и sched_end_date. – alex

+0

ОК. так что не так. Я пытаюсь вытащить все строки из ayear, где sched_start_date и sched_end_date находятся между block_start_date и block_end_date, предоставили мне как 1516, так и 1617. Почему сравнение sched_start_date> = (выберите max (.... и sched_end_date <= (select (max не имеет никакого эффекта – alex

ответ

0

Рассмотрим следующий пример:

CREATE TABLE ayear 
(ay INT NOT NULL PRIMARY KEY 
,Block INT NOT NULL 
,Block_start_date DATE NOT NULL 
,Block_end_date DATE NOT NULL 
); 

INSERT INTO ayear VALUES 
(1213 ,4 ,'2012-07-09','2013-05-13'), 
(1314 ,4 ,'2013-07-01','2014-05-09'), 
(1415 ,4 ,'2014-06-23','2015-05-08'), 
(1516 ,4 ,'2015-07-06','2016-05-09'), 
(1617 ,4 ,'2016-04-11','2017-05-01'); 

Стандартный шаблон для перекрытия диапазонов времени выглядит следующим образом:

SELECT * 
    FROM ayear 
WHERE '2016-05-06' > block_start_date 
    AND '2016-04-11' < block_end_date; 
+------+-------+------------------+----------------+ 
| ay | Block | Block_start_date | Block_end_date | 
+------+-------+------------------+----------------+ 
| 1516 |  4 | 2015-07-06  | 2016-05-09  | 
| 1617 |  4 | 2016-04-11  | 2017-05-01  | 
+------+-------+------------------+----------------+ 
+0

, так что вы дублируете таблицу ayear. Как она дает мне запланированное событие из таблицы расписания, которая показана 4/11/16 и 5/6/16 – alex

+0

Для ясности я опустил один t частью проблемы. – Strawberry