人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

POSTGRESQLのSQLで以下はどのように書くのでしょうか?

PHPでかきます。
PHPでの変数を年を$year、月を$monthとします。

テーブルAは次のようになっています。(ins_dateはdate型)
nopriceins_date
150002006-03-01
240002005-10-10
330002006-01-11
420002006-02-15
510002005-12-24
620002006-02-24

ここから、
(1)$year年$month月を含んで、それよりも前の期間のselect結果
(例えば2005年12月だとしたら、2005年12月までの結果。noで言うと、2と5が結果としてでるようなSQL)

(2)$year年$month月の結果
(例えば2006年02月だとしたら、2006年02月までの結果。noで言うと、4と6が結果としてでるようなSQL)

自分では以下のようになるかと思ったのですが、どうも結果が違うようです。
(1)"select * from table_A where ins_date < '".$year."-".$month."-01' + '1months'"

(2)"select * from table_A where ins_date between '".$year."-".$month."-01' and '".$year."-".$month."-01' + '1months'"

'1months'あたりが違うような気がしているのですが、このようなときどのように書くのでしょうか?

●質問者: iiiiiiiii
●カテゴリ:ウェブ制作
✍キーワード:12月 2005-10-10 2005-12-24 2005年 2006
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● kimizu
●27ポイント

日付と比較するときに、文字列で比較するのはNG。

比較でやるなら比較対象文字列を日付型に変換しないとダメだと思うデス。

1) $year年$month月を含んで、それよりも前の期間のselect結果

select * from table_A where ins_date <= (to_date('$year$month01','YYMMDD')+'1 months'+'-1 days');

2) $year年$month月の結果

select * from table_A where to_char(ins_date,'yyyy.mm.dd') like '$year$month%';

出来たselect文を試しに画面出力してみると解りやすいかも。

結果が違う、とは具体的にどのように出力されてしまうのかを

書いた方が回答しやすいと思いますよ。

◎質問者からの返答

ありがとうございます。

試してみます。


2 ● birdie-brain
●27ポイント

年+月で条件を指定するのが目的であれば、もっと単純な方法があります。

date_trunc()関数を使って、ins_dateの日付を年+月に切り詰めてしまえばよいのです。

たとえば、質問(1)と(2)は以下の通りに記述できます。

(1) "SELECT * FROM table_A WHERE date_trunc('month', ins_date) <= to_date('".$year."-".$month."-01"', 'YYYY-MM-DD')"

(2) "SELECT * FROM table_A WHERE date_trunc('month', ins_date) = to_date('".$year."-".$month."-01"', 'YYYY-MM-DD')"

◎質問者からの返答

ありがとうございます。

うまくいきました。


3 ●
●27ポイント

(1)

select * from table_A where ins_date < to_date('$year-$month','YYYY-MM') + interval '1 month';

ins_dateがdate型なのであれば、$year、$monthをto_date関数で明示的にdate型に変換した後、比較した方が良いと思います。

http://www.postgresql.jp/document/pg813doc/html/functions-fo...

to_dateについては上記のURLの内容をご確認ください。

to_date関数でYYYYMMまでの指定をすると、dateは自動的に01日00時00分00秒になります。

日付の計算はPostgreSQLでは間隔(interval)を足す、あるいは引く、といったイメージになりますので、今回のケースでは、intervalを+する必要があります。

これで、ins_dateが$year、$monthで指定した値の翌月の01日00時00分00秒より前のものを選択することが出来るはずです。

http://www.postgresql.jp/document/pg813doc/html/functions-da...

プラス演算子(+)の使い方については上記のURLの内容をご確認ください。

('1 month'の部分は'1 months'でも良かったはずです。)

(2)

確かPostgreSQLにはbetween関数はなかったと思います。(記憶違いでしたらすみません。)

単純に

という条件をwhere句で指定すれば良いはずです。

select * from table_A where ins_date >= to_date('$year-$month','YYYY-MM') and ins_date < to_date('$year-$month','YYYY-MM') + interval '1 month';

現在、PostgreSQLを試せる環境がないので、チェックはできておりません。

一度試してみてください。

◎質問者からの返答

ありがとうございます。

こちらもうまくいきました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ