2010-09-21 57 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

相關問題