3

次のような 3 つの列があります。

Column1       Date1         Date2
Test2         2012-06-10    
Test8         2012-05-05    2012-06-10

まず、このデータ セットが与えられた場合の目的の出力について説明します。次のようになります。

Year    Month    Sum
2012    05       1
2012    06       2
2012    07       1

Column1 に数値が含まれている場合 (WHERE Column1 LIKE '%2%' などで見つけることができます)、この数値を Date1 の月の値に追加する必要があります。これは最初の行の場合です。つまり、月 06 と月 07 に 1 が追加されます。ただし、行 2 の場合、Date2 に日付がある場合、Date1 に 1 を追加するだけで、毎月Date2 に月を含めます。これが、05 と 06 に 1 を追加する理由です。

このクエリは INTERVAL 関数を使用すると思いますが、将来の月に値を追加する方法がわかりません。

アップデート:

@CraigRinger - もう一度説明します。Column1 の数値を使用して、Date1 の日付が何ヶ月先まで実行されるかを判断したいと思います。最初の行では、2012-06 から 2012-07 まで実行されます (Column1 に 2 があるため)。

Date2 はキャンセル日と見なすことができます。行 2 の場合、Date1 は 8 か月間継続しますが、(Date2 によって) キャンセルされるため、05 から 06 までしか実行されません。

つまり、クエリは、開始月 (Date1) と、終了日 (存在する場合は Date2) までのすべての月に 1 を追加する必要があります。

すべての行の月の合計がわかるように、これらの月ごとに 1 を追加したいと思います。これには、日付間隔 (Column1 の数値に等しい) を Date1 に追加し、これら 2 つの数値の間の日付から月を抽出し、それらに 1 を追加する必要があると思います。残念ながら、これを実装する最善の方法がわかりません。

今回も分かりやすく説明できてよかったです!

4

2 に答える 2

7

postgres で日付に月を追加する構文は次のとおりです。

select <date> + cast('1 months' as interval)

あなたのロジックの残りの部分はかなり複雑ですが、あなたの質問は日付に月を追加することについてのようです.

于 2012-08-27T16:24:27.807 に答える
3

上記のデータ サンプルに基づくと、以下で十分です。

create table ddata(test text, d1 date, d2 date);
insert into ddata values ('Test2','2012-06-10'::date,null),('Test8','2012-05-05','2012-6-10')

文字列値から月数を取得するには

SELECT substring(test,E'\\d+$') FROM ddata;

2 番目の日付が設定されている月の差を取得するには

SELECT ((extract(year FROM d2) - extract(year FROM d1)) *12) + extract(month FROM d2) - extract(month FROM d1)
  FROM ddata;

case ステートメントを使用してどの月の計算を使用するかを決定し、generate_series を使用してカウントする中間日付のリストを作成してまとめます。

SELECT extract(year FROM ccal.cdate),
       extract(month FROM ccal.cdate),
       count(*) AS test_count
FROM
(SELECT generate_series(mcal.d1, mcal.d1 + CAST((mcal.num_mths || ' months') AS INTERVAL), '1 month') AS cdate
  FROM
(SELECT d1,
       CASE (d2 IS NULL)
            WHEN TRUE THEN
                substring(test,E'\\d+$')::integer - 1
            ELSE 
                ((extract(year FROM d2) - extract(year FROM d1)) *12) + extract(month FROM d2) - extract(month FROM d1)
            END as num_mths
 from ddata) as mcal

 )AS ccal
GROUP BY 1,2
ORDER BY 1,2;
于 2012-08-28T10:19:47.503 に答える