2013-03-21 269 views
0

我在Heroku上展示了一個奇怪的問題。我似乎只訪問主機環境而不是數據庫。Heroku的PostgreSQL錯誤與「BETWEEN」

我已經創建了一個小測試應用程序,在過期問題追蹤它。

這這裏是我的測試應用程序的源代碼:http://snippi.com/s/xd511rf

正如你可以在線看,我想收到其中創建今天所有條目! 這將是我的測試數據的前兩項與Ruby Gem DataMapper

當我在我的筆記本上運行這個程序(Ubuntu的12.10,HP,紅寶石1.9.3)寄託都是正確的我得到這個數據,這是對的:

[ 
{ 
    "id": 1, 
    "text": "Working on some awsomenewss", 
    "category": 0, 
    "starttime": "2013-03-21T15:56:00+01:00", 
    "endtime": "2013-03-21T18:26:00+01:00", 
    "creation": "2013-03-21T16:15:21+01:00" 
}, 
{ 
    "id": 2, 
    "text": "facebooking", 
    "category": 0, 
    "starttime": "2013-03-21T20:48:00+01:00", 
    "endtime": "2013-03-21T22:26:00+01:00", 
    "creation": "2013-03-21T16:15:21+01:00" 
} 
] 

在我調試控制檯這個SQL查詢已記錄:

SELECT "id", "text", "category", "starttime", "endtime", "creation" 
    FROM "entries" 
    WHERE "starttime" 
    BETWEEN '2013-03-21T00:00:00+00:00' 
     AND '2013-03-21T23:59:59+00:00' 
    ORDER BY "id" 

但後來我將應用程序推到Heroku,併發生了一個非常奇怪的錯誤。當我現在運行它(http://afternoon-everglades-4239.herokuapp.com/),這是響應:

[] 

爲什麼是空的?

的數據是defenitly其中通過此Dataclip從Heroku的證明數據庫:https://dataclips.heroku.com/hygziosyxwperyctwfbhjzgbzhbj

而且當我運行經由'heroku PG SQL命令手冊:psql'它實際上與該輸出的工作原理:

 id |   text    | category |  starttime  |  endtime  |  creation  
----+-----------------------------+----------+---------------------+---------------------+--------------------- 
    1 | Working on some awsomenewss |  0 | 2013-03-21 15:56:00 | 2013-03-21 18:26:00 | 2013-03-21 16:15:21 
    2 | facebooking     |  0 | 2013-03-21 20:48:00 | 2013-03-21 22:26:00 | 2013-03-21 16:15:21 
(2 rows) 

日誌不包含ANY錯誤或更多信息。 在這兩種情況下(生產和本地)我都使用了一個遠程Heroku PostgreSQL數據庫

那麼,爲什麼這不起作用?

感謝您的幫助, 凱文

+0

對於這個問題,您的具有精確類型聲明的表創建腳本是**必不可少的**。 – 2013-03-21 16:34:24

回答

2

是否已連接到正確的數據庫?在同一個會話中嘗試SELECT * FROM starttime;

如果您是:檢查數據類型的列和您的時區。你可能會混淆timestamp with time zone and timestamp
從外觀上看,您的表格中有timestamp,但用timestamptz查詢。這樣,這一切都取決於會話的本地時區(如果未另行指定,則默認爲服務器的時區)。
如果時區與您無關,則切換爲timestamptz或簡單地timestamp

不是你的問題的原因,但你查詢大概應該是:

SELECT id, text, category, starttime, endtime, creation 
FROM entries 
WHERE starttime >= '2013-03-21 0:0'::timestamp 
AND starttime < '2013-03-22 0:0'::timestamp 
ORDER BY id 

或者更簡單:

SELECT id, text, category, starttime, endtime, creation 
FROM entries 
WHERE starttime >= '2013-03-21'::date 
AND starttime < '2013-03-22'::date 
ORDER BY id 

a BETWEEN x AND y幾乎總是錯誤timestamp類型 - 分數數字! 您的查詢會對starttime = '2013-03-21T23:59:59.123+00'做什麼?

+1

如果你看[數據剪輯](https://dataclips.heroku.com/hygziosyxwperyctwfbhjzgbzhbj),你會發現timestamp值中沒有時區,所以我猜測列是'timestamp'比'timestamptz'。這也與通常的「時間戳」一致,並且數據庫中的所有內容都採用UTC格式,這源於Rails(即因爲Rails人員不瞭解關係數據庫而導致的另一個隱藏的問題)。 – 2013-03-21 17:38:46

+1

我會更強烈地說**不管什麼類型,「BETWEEN」幾乎總是錯誤的**。我在野外看到的'BETWEEN'的90%使用真的希望成爲你明確寫出的包容性開始獨家結束間隔測試。 – dbenhur 2013-03-21 20:41:51

+0

非常感謝你這個可靠的答案。我今晚會試一試,如果一切正常,我會回答。 – Reflic 2013-03-22 16:36:26