2012-01-19 3 views
0

Здравствуйте, у меня возникла проблема с правильной выборкой требуемых строк из таблицы MySQL в интервале дат.Оператор MySQL для извлечения строк между временными отметками unix

Моя таблица была такой структуры первоначально (да с unixtimestamps не MySQL даты):

id name departures     depmin   depmax 
------------------------------------------------------------------------- 
    1  a  1327608000     1327608000  1327608000 

    2  b 1321646400,1322856000,  1321646400  1337976000 
       1325880000,1327694400, 
       1329508800,1330718400, 
       1331928000,1332532800, 
       1333137600,1333742400, 
       1334347200,1334952000, 
       1336161600,1336766400, 
       1337371200,1337976000 

    3  c 1315166400,1316894400,  1315166400 1327780800 
       1317758400,1318968000, 
       1319918400,1320004800, 
       1320091200,1320177600, 
       1321387200,1324152000, 
       1325448000,1325534400, 
       1325620800,1327780800 
------------------------------------------------------------------------ 

Моя задача состоит в том, чтобы получить все 3 ряда с уходом между 1327536001 и 1327881601, но если я запрашиваю так:

SELECT * FROM exampletable WHERE depmin >= 1327536001 AND depmax <= 1327881601 

Я получаю только первую строку (с идентификатором 1 и именем a). Так что я совершенно смущен, как получить все три строки между этим примерным интервалом?

Просьба сообщить, как построить мой запрос или как переформатировать таблицу.

+1

Ну, две другие строки не совсем в этом интервале - в лучшем случае они перекрываются. –

+0

Они есть. Посмотрите колонку «отъезд». – moogeek

ответ

1

Если я правильно понимаю ваш вопрос, вы хотите, чтобы получить все id вот где любые временные метки из колонки departures падения в пределах определенного интервала.

К несчастью, нет простого способа добиться этого. Вам придется либо написать обширную хранимую процедуру/функцию (включая синтаксический анализ строки из столбца departures, внесение результатов в переменную массива или временную таблицу, сравнение их с вашими границами и т. Д.), Или вам придется сильно перепроектировать вашу базу данных.

Лично я хотел бы предложить, чтобы переместить данные из departures столбца в отдельную таблицу, один раз отъезда в строке, например:

id   departure 
------------------------------ 
    1  1327608000 
    2  1321646400 
    2  1322856000 
... 

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

SELECT * FROM exampletable WHERE id IN (SELECT id FROM departures WHERE departure >= 1327536001 AND departure <= 1327881601) 
+0

Это именно то, что я пытался спросить. Спасибо, Сергей! – moogeek

2

Вы получите все 3 строки, если значения depmin для b и c на самом деле больше 1327536001. Похоже на проблему с данными. SQL-запрос выглядит хорошо для меня.

2

Вы получаете совершенно действительный результат, то первая строка является единственным с depmin больше чем или равный 1327536001 и depmax меньше или равно 1327881601. Если вы хотите ограничить depmin или только depmax, просить об этом.

0

Возможно, вам нужно поменять depmin и depmax в вашем запросе.

Это будет означать "интервалы имеют пересечение с [1327536001 ... 1327881601]"

1

Посмотрите на ваших 4 записей таблицы, как это:

1. depmin: 1327608000 
    query: 1327536001  depmin >= query -> TRUE 

    depmax: 1327608000 
    query : 1327881601  depmax <= query -> TRUE 

TRUE and TRUE -> TRUE 

2. depmin: 1321646400 
    query : 1327536001  depmin >= query -> FALSE 

    depmax: 1337976000 
    query : 1327881601  depmax <= query -> FALSE 

FALSE and FALSE -> FALSe 

Если, если я читаю ваш вопрос прямо , вы просто пытаетесь найти все строки, где диапазоны временной метки запроса перекрывают метки времени таблицы базы данных, то ваша логика должна быть на самом деле:

WHERE depmax >= 1327536001 AND depmin <= 1327881601 
     ^^^^^^----- reversed ----^^^^^^ 

Таким образом, вы получите любую запись где его значения min/max находятся в пределах диапазонов вашего запроса.

+0

Да, это верно для моего вопроса. Спасибо. Но я не могу явно показать правильный пример, основанный на данных моей производственной таблицы, где у меня все еще есть проблема. – moogeek

Смежные вопросы