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

(PHP・POSTGRESQL)特定期間内に誕生日を迎えるユーザを抽出したい

例として下記のようなレコードがDBにあるとします

名前 | 誕生日
-----------------
a | 19901016
b | 19930312
c | 19600106
d | 19800110

※誕生日は本来タイムスタンプで格納されていますが
わかりやすくするためにYYYYMMDD形式で表記しています

上記テーブルから1月6日から1月10日の間に誕生日を
迎える人を抽出するにはどのような方法がベストでしょうか
注意していただきたい点としては誕生日の年は考慮せずに
純粋に月と日のみの範囲で抽出したいという点になります
(上記テーブルで考えるとcとdの2件を抽出したい)

よろしくお願いします

●質問者: jayz
●カテゴリ:インターネット ウェブ制作
✍キーワード:1月10日 1月6日 dB PHP postgreSQL
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● kn1967
●26ポイント

シンプルに・・・

SELECT * FROM テーブル WHERE to_char(誕生日, 'MMDD') BETWEEN '0106' AND '0110';
◎質問者からの返答

いつもありがとうございます

期待通りの値を得ることができました

・・・と思いましたが

年をまたいで範囲を指定する場合に一工夫必要ですね


2 ● chuken_kenkou
●27ポイント

timestamp型から日時を得るには、date_part等の

http://www.postgresql.jp/document/pg820doc/html/functions-dateti...

があるのですが、ここでは一つの関数で月日を得られるto_char関数

http://www.postgresql.jp/document/pg820doc/html/functions-format...

を使った例です。

select
 *
 from t1
 where to_char(birthday,'MM-DD') between '01-06' and '01-10'

もし母体件数が多く、インデクスを利用しないと性能が出せないようであれば、PostgeSQLには商用RDBMSで多く実装されている を定義するといった手段があります。


3 ● chuken_kenkou
●27ポイント

#1です。

式インデクスの説明が漏れていました。

PostgreSQLでは、商用RDBMSで多く実装されている式に対するインデクスを定義できます。

http://www.postgresql.jp/document/pg820doc/html/indexes-expressi...


定義形式は、(式)と、式を括弧で囲むのが特徴です。

create index インデクス名 on 表名((式));

#1の検索条件でも有効利用可能なインデクスを定義する例です。

create index t1ix1 on t1((to_char(birthday,'MM-DD')));
◎質問者からの返答

式に対してもインデックスが定義できることを知りませんでした

参考になります

関連質問


●質問をもっと探す●



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