3

DATETIME のみを使用して、テーブル内の定期的な毎週のイベントを追跡しています。私は時間とそれが当たる曜日だけを気にします。

セットの DATETIME を現在または今後の未来に変換できる必要があります。

IE現在の日付を使用して保存された日付を次の日付に変換するにはどうすればよい2013-02-22 12:00:00ですか? つまり、次の金曜日の 12:00:002013-03-01 12:00:00にイベントを日付順に並べ替えることができますか?

または、TIME と曜日を 0 ~ 6 の数字として別​​々に保存することもできます。

アップデート:

Erwin から次のようなものを受け取りました。

Event.order("date_trunc('week', now()::timestamp) + (start_at - date_trunc('week', start_at))")

私が取得する最初の日付が月曜日であり、最後に置く日曜日に存在することがわかっているイベントをスキップすることを除いて、それらを注文しているようです。

4

2 に答える 2

4

最良の選択は、timestampまたはtimestamptz( timestamop with time zone) を格納することです。複数のタイムゾーンを処理する必要がある場合は、それを作成しtimestamptz、ローカル時間または UTC などで操作するかどうかを定義します。この関連する回答の詳細:
Rails と PostgreSQL でタイムゾーンを完全に無視する

タイムスタンプを現在の週に効率的に置き換える方法のデモ (同じ曜日と時刻)。ここで仮定timestampします:

SELECT date_trunc('week', now()::timestamp) + (t - date_trunc('week', t))
FROM (SELECT '2013-02-15 12:00:00'::timestamp AS t) x;

intervalトリックは、対応する週の開始と指定された の間の を計算し、timestampそれを の助けを借りて現在の週の開始に追加することですdate_trunc()

ISO週は月曜日から始まり、日曜日が最後になります。

または、与えられた に 1 週​​間追加するにはtimestamp:

SELECT t + interval '1 week';

したいORDER BYだけの場合は、間隔のみが必要です。

ORDER BY (t - date_trunc('week', t))

日曜日を最初に置きたい場合 (シフト日):

ORDER BY ((t + interval '1d') - date_trunc('week', (t + interval '1d'))

またはより簡単に:

ORDER BY EXTRACT(dow FROM t), t::time

EXTRACT() に関するマニュアルの引用:

dow
Sunday(0) から Saturday(6) までの曜日

isodow
Monday(1) から Sunday(7) までの曜日

コメントでの質問への回答

私は現在の日付に関連してそれらを注文することにのみ興味があります。つまり、火曜日の場合、最初に火曜日、最後に月曜日が必要です。

「今日」の深夜にラッピング:

ORDER BY (EXTRACT(dow FROM t)::int + 7 - EXTRACT(dow FROM now())::int) % 7
         ,t::time

モジュロ演算子%を使用して、「今日」に従って日をシフトします。の代わりに を
使用すると、 で始めると簡単になります。dowisodow0%

于 2013-02-23T14:07:20.260 に答える
1

日時を使用し続けます。シンプルで、柔軟性を提供します。抽出関数を使用して、時刻と曜日の結果を取得できます。このページが役に立ちます。 http://www.postgresql.org/docs/9.3/static/functions-datetime.html

于 2013-02-23T13:36:28.127 に答える