Mysql Выборка за период

olejan1991

Новичок
имеется таблица с датами типа



id | date_from | date_to
1 | 01.01.1999 | 27.09.1999
2 | 28.09.1999 | 15.10.1999
3 | 16.10.1999 | 13.11.1999
4 | 14.11.1999 | 31.12.1999

1. как выбрать период с 30.09 по 10.11 . В этот период попадают 2 и 3 строки. Как сделать такой запрос?
2. как выбрать период с 16.11 по 10.01 . В этот период попадают 4 и 1 строки. Как сделать такой запрос?

В реальном проекте даты записаны в unix формате

т.е. вот так

id | date_from | date_to
1 | 915148800 | 938390400
2 | 938476800 | 939945600
3 | 940032000 | 942451200
4 | 942537600 | 946598400
 

Luge

Нестандартное звание

olejan1991

Новичок
ну, таймштамп — это же int, так и сделай
Код:
WHERE `date_from` >= MY_TIMESTAMP_START AND  `date_to` <= MY_TIMESTAMP_END
или через какие-нибудь FROM_UNIXTIME и BETWEEN

и на почитать
http://php.net/strtotime
http://php.net/mktime
https://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html#function_from-unixtime
https://dev.mysql.com/doc/refman/5.6/en/comparison-operators.html#operator_between
так уж вышло,что я знаю как переводить дату из обычной в юникс и вопрос не в этом. between пробовал, не выходит, берет лишнее
 

Luge

Нестандартное звание
тут, видимо, для поддержания диалога, следовало бы показать как не получается
 

olejan1991

Новичок
тут, видимо, для поддержания диалога, следовало бы показать как не получается
Эти зпросы не подходят

SELECT * FROM `test` WHERE `date_from` >= 938563200 AND `date_to` <= 942364800

SELECT * FROM `test` WHERE `date_from` >= 938563200 OR `date_to` <= 942364800

Этот работает для этих дат

SELECT * FROM `test` WHERE 938563200<=date_to and date_from <= 942364800


но если забить большее количество дат то не работает
 

Luge

Нестандартное звание
ты реши что тебе именно надо:
Выбрать строки, где date_from и date_to оба соответствуют твоему условию (date_from <= START AND date_to >= END) Тут из твоей таблицы вообще нет значений
или где хоть как-то пересекаются множества?
Кстати, с 16.11.1999 по 10.01.1999 быть не может вообще
 

fixxxer

К.О.
Партнер клуба
Разумеется, тебе надо условия и для from и для to в рамках периода.

В более нормальных базах с этим проще - есть range types.
 

Luge

Нестандартное звание
Забавно как формулировка задачу меняет.
Вообще-то пересечения отрезков выбираются как
start1 <= end2 and start2 <= end1
Таким образом для промежутка внутри года это всего лишь
date_to >= START AND date_from <= END
А при переходе на другой год разбить отрезок на 2: START - КОНЕЦ ГОДА и НАЧАЛО ГОДА - КОНЕЦ
date_to >= START AND date_from <= КОНЕЦ ГОДА OR date_to >= НАЧАЛО ГОДА AND date_from <= END
 
Сверху