У меня есть одна таблица, в которой хранятся значения с определенным моментом времени:
CREATE TABLE values
(
value DECIMAL,
datetime DATETIME
)
Может быть много значений в каждый день, также может быть только одно значение для данного дня. Теперь я хочу получить значение для каждого дня в заданный промежуток времени (например, один месяц), который является ближайшим к данному времени суток. Я хочу получать только одно значение в день, если есть записи для этого дня или нет значения, если нет записей. Моя база данных - PostgreSQL. Я застрял с этим. Я мог бы просто получить все значения во временном интервале и программно выбрать ближайшее значение для каждого дня, но это означало бы получение большого количества данных из базы данных, поскольку в один день может быть много значений.
(Update)
Чтобы сформулировать это немного более абстрактно: у меня есть данные произвольной точности (может быть одна минута, может быть два часа или два дня), и я хочу преобразовать их в фиксированную точность в один день с конкретным день.
(второе обновление)
Это запрос из принятого ответа с правильными беседами типа postgresql, при условии, что желаемое время составляет 16: 00:
SELECT datetime, value FROM values, (
SELECT DATE(datetime) AS date, MIN(ABS(EXTRACT(EPOCH FROM TIME '16:00' - CAST(datetime AS TIME)))) AS timediff
FROM values
GROUP BY DATE(datetime)
) AS besttimes
WHERE
CAST(values.datetime AS TIME) BETWEEN TIME '16:00' - CAST(besttimes.timediff::text || ' seconds' AS INTERVAL)
AND TIME '16:00' + CAST(besttimes.timediff::text || ' seconds' AS INTERVAL)
AND DATE(values.datetime) = besttimes.date