0

HerokuでPostgresで発生した問題を追跡するための小さなテストアプリを作成しました:http ://snippi.com/s/xd511rf

49行目でわかるように、今日作成されたすべてのエントリを取得したいと思います。これは、 RubyGemDataMapperを使用したテストデータの最初の2つの項目になります。

このアプリをノートブック(Ubuntu 12.10、HP、Ruby 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/)、これが応答です。

[]

なぜ空なのですか?

データは間違いなくデータベースにあり、HerokuのこのDataclipによって証明されています:https ://dataclips.heroku.com/hygziosyxwperyctwfbhjzgbzhbj

また、「heroku pg:psql」を介してSQLコマンドを手動で実行すると、実際には次の出力で機能します。

id | テキスト| カテゴリ| 開始時間| 終了時間| 作成       
---- + ----------------------------- + ---------- + ---- ----------------- + --------------------- + ---------- -----------
  1 | いくつかのawsomenewsに取り組んでいます| 0 | 2013-03-21 15:56:00 | 2013-03-21 18:26:00 | 2013-03-21 16:15:21
  2 | フェイスブック| 0 | 2013-03-21 20:48:00 | 2013-03-21 22:26:00 | 2013-03-21 16:15:21
(2行)

ログにはエラーや詳細情報は含まれていません。どちらの場合も(本番環境とローカル) 、リモートHerokuPostgreSQLデータベースを使用しました。

では、なぜこれが機能しないのですか?

4

1 に答える 1

3

列のデータ型とタイムゾーンを確認してください。あなたは混乱timestamp with time zoneしてtimestampいるかもしれません。

テーブルにあるように見えますがtimestamp、でクエリを実行しtimestamptzます。このように、すべてはセッションのローカルタイムゾーンに依存します(特に指定されていない場合、デフォルトでサーバーのタイムゾーンになります)。

両方をtimestamptzに切り替えます。またはtimestamp、タイムゾーンが完全に無関係な場合は切り替えます。(疑わしい場合は、を使用してtimestamptzください。)

問題の原因ではありませんが、クエリはおそらく次のようになります。

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

a BETWEEN x AND y小数のため、ほとんどの場合、型は間違っています!timestampあなたのクエリは何をしますstarttime = '2013-03-21T23:59:59.123+00'か?

于 2013-03-21T16:41:52.693 に答える