2010-09-21 58 views
3

我有在某个时间点存储值的一个表:SQL:选择一个记录每天最接近的具体时间

CREATE TABLE values 
(
    value DECIMAL, 
    datetime DATETIME 
) 

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

(更新)

制订有点更抽象的:我有(可能是一分钟也过了两小时或2天)的任意精度的数据,我想将其转换为一个固定的精度有一天,一天的特定时间。

(第二次更新)

这是从正确的PostgreSQL类型converstions接受的答案查询,假设所需的时间是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 

回答

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(时间)函数,所以您将不得不将它们替换它们。

+0

看起来不错!我目前正在试图找到正确的函数来获取日期时间(看起来不是TIME())。当我得到结果时,我会再次写信。 – 2010-09-21 13:18:43

+0

没关系,发现它(当然在SO上):CAST(datetime AS TIME)http://stackoverflow.com/questions/3724519/is-there-a-better-way-to-extract-the-time-of-天 – 2010-09-21 13:25:48

+0

哇,这工作得很好!谢谢!一些转换是必要的。我在原帖中发布工作版本。 – 2010-09-21 14:05:51

2

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

  1. 是否有一天所有的结果?

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

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

接下来需要注意的是,您不必从数据库中提取数据,等到您有答案或不使用PLSQL函数(或其他)来先在服务器上解决问题。

一旦您选择了几次检查,您可以使用intervals来比较它们。检查Postgres文档上的时间间隔和日期时间函数以获得精确的说明,但基本上,您会从给出的日期减去所选的日期,并且间隔最小的日期是您想要的日期。

+0

我将在基本查询工作时看看函数。感谢您的想法! – 2010-09-21 13:19:38

相关问题