Выберите диапазон времени из unix-timestamp - PullRequest
0 голосов
/ 25 января 2012

У меня есть таблица MYSQL с двумя столбцами, отметкой времени и диапазоном. timestamp - это unix-timestamp, а span - целое число.

Я хочу выбрать все строки, где отметка времени находится между текущим временем + - половина интервала.

Например. если текущее время 23:00, то я хочу, чтобы все строки, где отметка времени находилась в диапазоне от 21 до 01. Конечно, проблема в том, что все отметки времени принадлежат разным дням.

ДЛЯ УТОЧНЕНИЯ, меня не волнует дата, только время

Я придумала способ сделать это, но это похоже на взлом. Я уверен, что кто-то с большим знанием MYSQL может показать мне более красивый способ сделать это.

SELECT *
    FROM table
    WHERE (
        TIME( DATE_SUB( CURDATE( ) , INTERVAL( span /2 ) HOUR ) ) <= TIME( DATE_ADD( CURDATE( ) , INTERVAL( span /2 ) HOUR ) )
        AND (
            TIME( FROM_UNIXTIME( timestamp ) ) >= TIME( DATE_SUB( CURDATE( ) , INTERVAL( span /2 ) HOUR ) )
            AND TIME( FROM_UNIXTIME( timestamp ) ) <= TIME( DATE_ADD( CURDATE( ) , INTERVAL( span /2 ) HOUR ) )
            )
        )
    OR (
        TIME( DATE_SUB( CURDATE( ) , INTERVAL( span /2 ) HOUR ) ) >= TIME( DATE_ADD( CURDATE( ) , INTERVAL( span /2 ) HOUR ) )
        AND (
            TIME( FROM_UNIXTIME( timestamp ) ) >= TIME( DATE_SUB( CURDATE( ) , INTERVAL( span /2 ) HOUR ) )
            OR TIME( FROM_UNIXTIME( timestamp ) ) <= TIME( DATE_ADD( CURDATE( ) , INTERVAL( span /2 ) HOUR ) )
        )
    )

Ответы [ 2 ]

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

На самом деле не нашел красивого решения, но так я и закончил.

SELECT *
    FROM table
    WHERE date_add( from_unixtime( timestamp ) , INTERVAL datediff( now( ) , from_unixtime( timestamp ) ) DAY )
    BETWEEN date_sub( now( ) , INTERVAL (span/2) HOUR )
    AND date_add( now( ) , INTERVAL (span/2) HOUR )
    OR date_add( from_unixtime( timestamp ) , INTERVAL datediff( now( ) , from_unixtime( timestamp ) ) -1 DAY )
    BETWEEN date_sub( now( ) , INTERVAL (span/2) HOUR )
    AND date_add( now( ) , INTERVAL (span/2) HOUR )
0 голосов
/ 25 января 2012

Я рекомендую два варианта.

  1. Оцените ваш «хакерский» запрос и посмотрите, быстрее ли он, чем два MySQL-запроса.Например: один запрос для получения целевой строки, другой запрос для получения результатов с интервалом ± 1/2.
  2. Напишите правильную хранимую процедуру MySQL.Это эффективный вариант (1), но все это делается внутри БД.

Другой вариант, который я не рекомендую, исходя из прошлой боли, состоит в использовании переменных MySQL для эффективного выполнения двух операций выбора, избегая хранимой процедуры.Например: http://dev.mysql.com/doc/refman/5.0/en/user-variables.html. Этот подход был обычным явлением в старые времена приложений PHP / MySQL.

По моему опыту шансы - хороший вариант (1) достаточно быстрый и читаемый.

...