0

PostreSQL で日付フィールドの正規表現を適切な日付に変換する方法があるかどうか疑問に思っています。

この「WHERE」ステートメントを適切なタイムスタンプ比較に変換したい:

WHERE date::text ~ '2013-0[1-9]-(0[1-9]|1[0-5])'

実際、これは非常に遅いです。pgsqlのタイムスタンプがテキストの正規表現検索用に作られていないからだと思います。

しかし、HTML フィールドに正規表現を記述することは、多くの JavaScript ウィジェットを使用するよりも開発がはるかに簡単です。正規表現は、はるかに柔軟でもあります。

私はどんな解決策やアドバイスも受け入れます

ありがとう、

4

1 に答える 1

1

「html フィールド」と JavaScript ウィジェットの意味がわかりませんそれは純粋な SQL の質問です。

とにかく、正規表現を正しく理解していれば、これはうまくいくはずです:

where extract(year from "date") = 2013
  and extract(month from "date") between 1 and 9
  and extract(day from "date") between 1 and 15

一部の式に関数ベースのインデックスを作成する場合にのみ高速になりますが、それ以外の場合はテーブル全体のスキャンも実行されます。次のインデックスはおそらく速度を上げるのに役立ちます(条件によって行数が大幅に減少すると仮定します)

create index idx_year 
    on foo (extract(year from "date"), 
            extract(month from "date"), 
            extract(day from "date"));

別のオプションは次のとおりです。

where "date" between DATE '2013-01-01' and DATE '2013-09-15' 
  and extract(day from "date") <= 15

ところで:date列の恐ろしい名前です。1 つ目は予約語でもあるため、2 つ目 (そしてより重要なこと) は、列に含まれる内容を文書化していないためです。

于 2013-09-25T09:27:44.090 に答える