46

PostgreSQL8.3を使用しています。私はこのようなテーブルを持っています:

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

4

5 に答える 5

101

を使用できます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これにより、週の最終日のタイムスタンプが除外されます(カットオフ時間はその日の深夜であるため)。

    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)

date_trunc(これは、y直接使用できないまれなケースです。)


週が日曜日に始まる場合は、に置き換えるdate_trunc('week', x)::datedate_trunc('week', x + '1 day'::interval)::date - '1 day'::intervalうまくいくはずです。

于 2012-08-01T15:02:34.607 に答える
18
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

于 2012-08-01T15:09:35.423 に答える
5

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

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

于 2015-08-18T10:52:25.723 に答える