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)
走向这个方向怎么样?
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(时间)功能,所以你可能需要更换它们.