Оператор MySQL для извлечения строк между временными метками Unix - PullRequest
0 голосов
/ 19 января 2012

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

Моя таблица изначально имела такую ​​структуру (да, с метками 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).Так что я совершенно не понимаю, как получить все три строки в интервале этого примера?

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

Ответы [ 5 ]

2 голосов
/ 19 января 2012

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

2 голосов
/ 19 января 2012

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

1 голос
/ 19 января 2012

Если я правильно понимаю ваш вопрос, вы хотите получить все 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)
1 голос
/ 19 января 2012

Посмотрите на ваши 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 ----^^^^^^

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

0 голосов
/ 19 января 2012

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

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

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