PostgreSQL 8.を使用しています。このようなテーブルがあります:
id regist_time result
-----------------------------------
1 2012-07-09 15:00:08 3
2 2012-07-25 22:24:22 7
4 2012-07-07 22:24:22 8
regist_time
のデータ型はtimestamp
です。
Numとして週の時間間隔(開始から終了まで)と合計(結果)を見つける必要があります。
結果を次のように取得したい:
week num
---------------------------------
7/1/2012-7/7/2012 10
7/8/2012-7/14/2012 5
7/15/2012-7/21/2012 3
7/22/2012-7/28/2012 11
今年だけで週番号を取得できます。
SELECT id,regis_time, EXTRACT(WEEK FROM regis_time) AS regweek
FROM tba
重要な部分は
EXTRACT(WEEK FROM regis_time)
抽出関数は今年の週番号のみを取得できますが、1週間で開始時刻から終了時刻を取得するにはどうすればよいですか?
date_trunc('week', ...)
を使用できます。
例えば:
_SELECT date_trunc('week', '2012-07-25 22:24:22'::timestamp);
-> 2012-07-23 00:00:00
_
その後、開始時間に興味がない場合は、これを日付に変換できます。
終了日も取得するには:
_SELECT date_trunc('week', '2012-07-25 22:24:22'::timestamp)::date
|| ' '
|| (date_trunc('week', '2012-07-25 22:24:22'::timestamp)+ '6 days'::interval)::date;
-> 2012-07-23 2012-07-29
_
(ここではデフォルトのフォーマットを使用しましたが、もちろんこれをMM/DD/YYYYを使用するように調整できます。)
タイムスタンプで比較する場合は、_(date_trunc('week', ...) + '6 days'::interval
_を使用する代わりに、週全体を追加し、週の終わりには厳密な比較を使用することができます。
これにより、週の最終日のy
タイムスタンプが除外されます(カットオフ時刻はその日の午前0時であるため)。
_ date_trunc('week', x)::date <= y::timestamp
AND y::timestamp <= (date_trunc('week', x) + '6 days'::interval)::date
_
これには次のものが含まれます。
_ date_trunc('week', x)::date <= y::timestamp
AND y::timestamp < (date_trunc('week', x) + '1 week'::interval)
_
(これは、まれに、y
で_date_trunc
_を使用できない場合です。)
あなたの週が日曜日に始まる場合、date_trunc('week', x)::date
をdate_trunc('week', x + '1 day'::interval)::date - '1 day'::interval
に置き換えるとうまくいくはずです。
select date_trunc('week', regist_time)::date || ' - ' ||
(date_trunc('week', regist_time) + '6 days') ::date as Week,
sum(result) Total
from YourTable
group by date_trunc('week', regist_time)
order by date_trunc('week', regist_time)
SQLFiddleの概念実証を参照してください: http://sqlfiddle.com/#!1/9e821/1
それは
select to_date('2015-07', 'IYYY-IW');
postgresで使用する
戻ります
2015-02-09
これは、現在の週のすべての日を取得するクエリに役立ちます。
select cast(date_trunc('week', current_date) as date) + i
from generate_series(0,6) i
2015-08-17
2015-08-18
2015-08-19
2015-08-20
2015-08-21
週の開始日と終了日を取得するには(月曜日の場合は0、金曜日の場合は4):
select cast(date_trunc('week', current_date) as date) + 0 || '-->' || cast(date_trunc('week', current_date) as date) + 4;
2015-08-17-> 2015-08-21