web-dev-qa-db-ja.com

PostgreSQLで週の開始日と終了日の文字列を取得する方法は?

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週間で開始時刻から終了時刻を取得するにはどうすればよいですか?

28
diligent

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)::datedate_trunc('week', x + '1 day'::interval)::date - '1 day'::intervalに置き換えるとうまくいくはずです。

60
Bruno
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

14
Adrian Carneiro

それは

select to_date('2015-07', 'IYYY-IW');

postgresで使用する

戻ります

2015-02-09
3
Mohamed Sami

これは、現在の週のすべての日を取得するクエリに役立ちます。

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

2
Ahmed MANSOUR