3

名前の付いたフィールドeffective_dateとデータ型がinteger(epoch date)のPostgreSQLテーブルがあります。私がやりたいのは、選択したeffective_dateを持つエントリのみを選択することです(月ごとにクエリを実行したいだけです)。私のクエリは以下のとおりです。問題は、テーブルに選択基準に一致するエントリが多数あるにもかかわらず、何も返されないことです。

$query = "select    *
          from ". $this->getTable() ."
          where pay_stub_entry_name_id = 43
          AND to_char(effective_date, 'Mon') = 'Jul'
          AND deleted = 0";
4

1 に答える 1

3

extract(month from the_date)の代わりに使用してくださいto_charPgドキュメントの日時関数を参照してください。

ケースやローカリゼーションなど、さまざまな問題に悩まされることto_charになります。

effective_dateのデータ型がtimestampまたはであると仮定すると、次のdateように記述します。

$query = "select    *
      from ". $this->getTable() ."
      where pay_stub_entry_name_id = 43
      AND extract(month from effective_date) = 7
      AND deleted = 0";

その場合integerは、エポック日付であると仮定して、を使用してタイムスタンプに変換しto_timestamp、それを使用する必要extractがあります。epoch上記にリンクされているドキュメントのセクションを参照してください。例:

$query = "select    *
      from ". $this->getTable() ."
      where pay_stub_entry_name_id = 43
      AND extract(month from to_timestamp(effective_date)) = 7
      AND deleted = 0";

問題の直接の原因はto_char(integer,text)、整数のエポック日付で呼び出していたことです。do日付フォーマットのtimestampバージョンのみ。他の人にとっては特別なことではないので、リテラル文字列として出力されただけです。比較:to_charMonMon

regress=# SELECT to_char(current_timestamp, 'Mon');
 to_char 
---------
 Aug
(1 row)

regress=# select to_char( extract(epoch from current_timestamp), 'Mon');
 to_char 
---------
 Mon
(1 row)

SQLインジェクションを回避するために、これらのクエリの実際のバージョンをパラメータ化することを忘れないでください。

于 2012-08-27T05:42:40.760 に答える