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

时间:2010-09-21 11:16:47

标签: sql datetime postgresql

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

CREATE TABLE values
(
    value DECIMAL,
    datetime DATETIME 
)

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

(更新)

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

(第二次更新)

这是来自已接受答案的查询,并且正确的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

2 个答案:

答案 0 :(得分: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

我不确定日期/时间提取和abs(时间)功能,因此您可能需要更换它们。

答案 1 :(得分:2)

看来你有两个部分需要解决:

  1. 一天都有结果吗?

  2. 如果有,那么哪个是最近的?

  3. 如果没有结果,通过在第1部分短路过程,您将节省大量执行时间。

    接下来要注意的是,你不必从数据库中提取数据,等到你有答案,或者不要使用PLSQL函数(或其他东西)来首先在服务器上进行处理。 / p>

    一旦您有选择的时间进行检查,您可以使用intervals来比较它们。检查有关间隔和日期时间函数的Postgres文档以获得精确的说明,但基本上你减去你给定日期的选定日期,间隔最小的日期是你想要的日期。