最良の選択は、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
モジュロ演算子%
を使用して、「今日」に従って日をシフトします。の代わりに を
使用すると、 で始めると簡単になります。dow
isodow
0
%