我有一个表,用于存储带有时间点的值:
CREATE TABLE values ( value DECIMAL, datetime DATETIME )
每天可能有很多值,一天中也可能只有一个值。现在,我想获取最接近给定时间的给定时间范围(例如一个月)中每一天的值。我只想每天获得一个值(如果有当天的记录),或者没有值(如果没有记录)。我的数据库是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
朝这个方向怎么样?
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
我不确定日期/时间提取和abs(time)函数,因此您可能必须替换它们。