SQL:为最接近特定时间的每一天选择一条记录

Sve*_*cke 3 sql postgresql datetime

我有一个表存储一个时间点的值:

CREATE TABLE values
(
    value DECIMAL,
    datetime DATETIME 
)
Run Code Online (Sandbox Code Playgroud)

每天可能有很多值,某一天也可能只有一个值.现在我想获得给定时间段(例如一个月)中每天最接近给定时间的值.如果有当天的记录,我只想每天获得一个值,如果没有记录,我只想获得没有值.我的数据库是PostgreSQL.我非常坚持这一点.我可以在时间跨度中获取所有值,并以编程方式为每一天选择最接近的值,但这意味着从数据库中提取大量数据,因为一天可能有很多值.

(更新)

为了使它更具抽象性:我有任意精度的数据(可能是一分钟,可能是两小时或两天),我想将它转换为一天的固定精度,具有一天的特定时间.

(第二次更新)

假设期望的时间是16:00,这是来自接受的答案的查询以及正确的postgresql类型转换:

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
Run Code Online (Sandbox Code Playgroud)

eum*_*iro 5

走向这个方向怎么样?

SELECT values.value, values.datetime
FROM values,
( SELECT DATE(datetime) AS date, MIN(ABS(_WANTED_TIME_ - TIME(datetime))) AS timediff
  FROM values
  GROUP BY DATE(datetime)
) AS besttimes
WHERE TIME(values.datetime) BETWEEN _WANTED_TIME_ - besttimes.timediff
                                AND _WANTED_TIME_ + besttimes.timediff
AND DATE(values.datetime) = besttimes.date
Run Code Online (Sandbox Code Playgroud)

我不确定日期/时间提取和abs(时间)功能,所以你可能需要更换它们.