例として下記のようなレコードがDBにあるとします
名前 | 誕生日
-----------------
a | 19901016
b | 19930312
c | 19600106
d | 19800110
※誕生日は本来タイムスタンプで格納されていますが
わかりやすくするためにYYYYMMDD形式で表記しています
上記テーブルから1月6日から1月10日の間に誕生日を
迎える人を抽出するにはどのような方法がベストでしょうか
注意していただきたい点としては誕生日の年は考慮せずに
純粋に月と日のみの範囲で抽出したいという点になります
(上記テーブルで考えるとcとdの2件を抽出したい)
よろしくお願いします
シンプルに・・・
SELECT * FROM テーブル WHERE to_char(誕生日, 'MMDD') BETWEEN '0106' AND '0110';
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で多く実装されている を定義するといった手段があります。
#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')));
式に対してもインデックスが定義できることを知りませんでした
参考になります
いつもありがとうございます
期待通りの値を得ることができました
・・・と思いましたが
年をまたいで範囲を指定する場合に一工夫必要ですね