Как выбрать данные, соответствующие ближайшему времени к определенному часу? - PullRequest
0 голосов
/ 05 июня 2019

У меня есть ряд данных с определенными временными метками. Я хочу сделать запрос, который получает данные, соответствующие ближайшему показателю, до 6:00 (t <6:00) каждый день в течение месяца. </p>

Я пытался сделать это несколькими способами, но ни один из них не дал мне того результата, который я хотел. Мне не понятно, как выполнить этот запрос: (

То, что я пробовал в данный момент, похоже, не сработало. Я пытался выполнить вложенные операции выбора, чтобы получить список допустимых времен, но не могу разобраться в логике этого

SELECT Measure, Time FROM Table
WHERE EXTRACT(HOUR FROM Time) = 5
AND TIME IN(SELECT Time FROM Table)

В конце я попробовал EXTRACT(HOUR FROM Time) = 5 and EXTRACT(MINUTES FROM Time) = 59, потому что в моем конкретном случае это работает, но я предпочитаю найти правильное решение.

Скажем, у меня много мер с нерегулярными временными метками. Мой запрос должен дать мне 30 строк (ну, это зависит от месяца) с ближайшей отметкой времени до 6:00 каждый день.

Спасибо за ожидание.

1 Ответ

1 голос
/ 05 июня 2019

Вот рабочий пример одного из способов решения проблемы.Я использовал MySQL, так как вы изначально не указали базу данных.Большинство SQL имеют схожие функции для работы с датами и временем, но для некоторых может потребоваться небольшая доработка.

Для создания тестовой базы данных:

CREATE SCHEMA IF NOT EXISTS `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
USE `test`;

DROP TABLE if exists `samples`;

CREATE TABLE if not exists `samples` (
        `id`     int not null auto_increment,
        `measure`       float null,
        `tstamp`        timestamp,
        primary key (`id`)
        )
ENGINE = MyISAM;

INSERT `samples` (measure, tstamp) VALUES
        (4.79,  '2019-06-04 05:59:24'),
        (6.80,  '2019-06-04 05:59:46'),
        (6.13,  '2019-06-04 06:00:19'),
        (8.18,  '2019-06-04 06:01:22'),
        (6.78,  '2019-06-04 06:01:15'),

        (3.79,  '2019-06-03 08:00:00'),
        (6.18,  '2019-06-03 07:00:00'),
        (4.78,  '2019-06-03 06:00:00'),
        (4.80,  '2019-06-03 05:00:00'),
        (4.13,  '2019-06-03 04:00:00');

Проверка:

mysql> select * from samples;
+----+---------+---------------------+
| id | measure | tstamp              |
+----+---------+---------------------+
|  1 |    4.79 | 2019-06-04 05:59:24 |
|  2 |     6.8 | 2019-06-04 05:59:46 |
|  3 |    6.13 | 2019-06-04 06:00:19 |
|  4 |    8.18 | 2019-06-04 06:01:22 |
|  5 |    6.78 | 2019-06-04 06:01:15 |
|  6 |    3.79 | 2019-06-03 08:00:00 |
|  7 |    6.18 | 2019-06-03 07:00:00 |
|  8 |    4.78 | 2019-06-03 06:00:00 |
|  9 |     4.8 | 2019-06-03 05:00:00 |
| 10 |    4.13 | 2019-06-03 04:00:00 |
+----+---------+---------------------+
10 rows in set (0.00 sec)

Вот запрос для перечисления данных для выборки, ближайшей к 06:00 3 июня:

USE test;
SELECT  measure,
        tstamp,
        abs(time_to_sec (time(tstamp)) - time_to_sec('6:00:00')) AS delta
FROM samples
WHERE tstamp BETWEEN '2019-06-03' AND '2019-06-04'
ORDER BY delta
LIMIT 1;

Тот же запрос, кроме выбора 4 июня:

SELECT  measure,
        tstamp,
        abs(time_to_sec (time(tstamp)) - time_to_sec('6:00:00')) AS delta
FROM samples
WHERE tstamp BETWEEN '2019-06-04' AND '2019-06-05'
ORDER BY delta
LIMIT 1;

Результаты:

Database changed
+---------+---------------------+-------+
| measure | tstamp              | delta |
+---------+---------------------+-------+
|    4.78 | 2019-06-03 06:00:00 |     0 |
+---------+---------------------+-------+
1 row in set (0.00 sec)

+---------+---------------------+-------+
| measure | tstamp              | delta |
+---------+---------------------+-------+
|     6.8 | 2019-06-04 05:59:46 |    14 |
+---------+---------------------+-------+
1 row in set (0.00 sec)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...