Как ВЫБРАТЬ все строки в пределах определенного диапазона даты / времени с определенным размером шага отметки времени в MySQL? - PullRequest
1 голос
/ 17 марта 2019

У меня есть таблица, содержащая данные датчика со столбцом timestamp, который содержит метку времени unix времени, когда было произведено измерение датчика.Теперь я хотел бы SELECT всех измерений в определенном диапазоне даты / времени с определенным временным шагом.
Я сам вычислил первую часть, как вы можете видеть в моем фрагменте кода ниже.

// With $date_start and $date_stop in the format: '2010-10-01 12:00:00'

$result = mysqli_query($connection, "SELECT sensor_1 
                                     FROM sensor_table 
                                     WHERE timestamp >= UNIX_TIMESTAMP($date_start) 
                                       AND timestamp < UNIX_TIMESTAMP($date_stop) 
                                     ORDER BY timestamp");  

Есть ли в MySQL удобный способ включить размер шага по времени в один и тот же запрос SELECT?

Моя таблица содержит тысячи измерений за месяцы, при этом одно измерение проводится каждые 5 секунд.

Теперь, допустим, я бы хотел SELECT измерений между 2010-10-01 12:00:00 и 2010-10-02 12:00:00, но втолько этот диапазон даты / времени SELECT одно измерение каждые 10 минут?(поскольку моя таблица содержит измерения, проводимые каждые 5 секунд).

Какие-нибудь умные идеи, как решить эту проблему в одном запросе?
(также приветствуются другие идеи:))

Ответы [ 3 ]

2 голосов
/ 17 марта 2019

Поскольку вы выполняете одно измерение каждые 5 секунд, разница между $date_start и первым совпадающим измерением не может быть больше 4. Затем мы делаем одну запись каждые 600 секунд (учитывая некоторое расхождение от часов к часам ...)

SELECT sensor_1 
  FROM sensor_table
 WHERE timestamp >= UNIX_TIMESTAMP($date_start) 
       AND 
       timestamp < UNIX_TIMESTAMP($date_stop) 
       AND
       ((timestamp - UNIX_TIMESTAMP($date_start)) % 600) BETWEEN 0 AND 4 
 ORDER BY timestamp;
0 голосов
/ 17 марта 2019

Я думаю, что вы можете использовать простой курсор в plSQL

    CREATE TABLE StoreValuesId
    (
      valueId int primary key;
    )

    CREATE OR REPLACE procedure_store[date_start date,date_stop date]
    DECLARE date_startUpdated date , date_stopUpdated date , date_diff TIME(7) = '00:10:00'
    IS 
    BEGIN
SELECT date_start INTO date_startUpdated;
SELECT date_stop INTO date_stopUpdated;
    IF timestamp BETWEEN date_start and date_stop then
    INSERT INTO StoreValuesId values(timestamp)

    date_startUpdated=DATEADD(SECOND, DATEDIFF(SECOND, 0, date_diff), date_startUpdated);
    date_stopUpdated=DATEADD(SECOND, DATEDIFF(SECOND, 0, date_diff), date_stopUpdated);
    END IF
    COMMIT;
    END

Опять же, синтаксис может быть неправильным, но я надеюсь, что вы поймете идею (давно не играл с sql)

0 голосов
/ 17 марта 2019

Это не элегантно, но вы можете сделать:

SELECT s.sensor_1 
FROM sensor_table s
WHERE s.timestamp >= UNIX_TIMESTAMP($date_start) AND
      s.timestamp < UNIX_TIMESTAMP($date_stop) AND
      s.timestamp = (SELECT MIN(s2.timestamp)
                     FROM sensor_table s2
                     WHERE s2.timestamp >= 60 * 10 * FLOOR(UNIX_TIMESTAMP(s.timestamp) / (60 * 10)) AND
                           s2.timestamp < s2.timestamp >= 60 * 10 * (1 + FLOOR(UNIX_TIMESTAMP(s.timestamp) / (60 * 10)))
                    )
ORDER BY timestamp;

Выбирает первое в каждом 10-минутном периоде.

...