1

イベントには多くのシフトがあります。

DATETIME 形式の列をstarts_at含むシフト テーブル。ends_at

shifts テーブルにクエリを実行すると、starts_atends_atの列は、タイムゾーン情報を含む文字列を返し、Rails によってActiveSupport::TimeWithZoneオブジェクトとして認識され、それに応じて操作できます。

結合を含むより複雑なクエリにshifts.starts_ator列を含めると、結果セットのタイムゾーン情報が失われているようです。shifts.ends_at次のクエリを検討してください。

SELECT events.id, events.name, events.default_shift_start,
shifts.id AS shift_id, shifts.starts_at, shifts.ends_at, users.id AS user_id,
users.first_name, users.last_name 
FROM "events" 
INNER JOIN "shifts" ON "shifts"."event_id" = "events"."id" 
INNER JOIN "requests" ON "requests"."shift_id" = "shifts"."id" 
INNER JOIN "users" ON "users"."id" = "requests"."user_id" 
WHERE (events.default_shift_start > '2012-08-22 05:55:22.069340' AND requests.status = 'accepted') 
ORDER BY default_shift_start ASC

編集:私はRailsでこのクエリを次の方法で呼び出しています:

Event.joins(:shifts => { :requests => :user}).where(["events.default_shift_start > ? AND requests.status = ?", Time.now, "accepted"]).select("events.id, events.name, events.default_shift_start, shifts.id AS shift_id, shifts.starts_at, shifts.ends_at, users.id AS user_id, users.first_name, users.last_name").order("default_shift_start ASC")

プロデュース:

+-----+----------+---------------------+---------- -----------+
| | ID | shift_id | starts_at | end_at |
+-----+----------+---------------------+---------- -----------+
| | 17 | 80 | 2012-08-23 00:30:00 | 2012-08-23 07:30:00 |
| | 17 | 55 | 2012-08-23 00:30:00 | 2012-08-23 07:30:00 |
+-----+----------+---------------------+---------- -----------+

問題は、結合されたテーブル ( shifts) の列がタイムゾーン データを返さないため、Rails がそれらを文字列データとして認識してしまうことです。データは UTC としてデータベースに保存されます。テーブルのdatetime列をevents同じクエリに含めると、結果にタイムゾーン データが含まれます。

ここで何が起こっているのかを理解しようとしてドキュメントを検索してきましたが、役に立ちませんでした。

4

2 に答える 2

2

関係するデータ型を把握することから始めるべきだと思います。PostgreSQLの「datetime」データ型は実際にはtimestampであり、2つのバリアントがあります:withwithout time zone。デフォルトはですwithout

内部的には、PostgreSQLは常にUTCタイムスタンプを保存します。タイムゾーンデータ自体は、タイムゾーンの有無にかかわらず、タイムスタンプ付きでまったく保存されません。これらは、クライアントのタイムゾーン設定に対応する入力および出力のデコレータにすぎません。

この関連する回答で、より詳細な説明、例、およびリンクを見つけてください。

于 2012-08-22T06:26:11.970 に答える
0

starts_at::timestamptz を入れれば大丈夫だと思います。

于 2012-08-22T08:16:04.250 に答える