web-dev-qa-db-ja.com

Postgres-> [22007]エラー:タイプtimestampの入力構文が無効です: ""

いくつかのデータ型を文字列として格納するテーブルがあります。この値は、タイムスタンプを表す文字列である場合があります。次のクエリは、フィールド名(RetsProviderで指定)でRetsEntryテーブルとRetsProviderテーブルを結合し、エントリのタイムスタンプが2回の間にある「systemid」列の値を除外することを目的としています。

SELECT
  *
FROM (
       SELECT
         systemid,
         cast(value AS TIMESTAMP) AS valueTS
       FROM cabarets.retsentry, cabarets.retsprovider
       WHERE cabarets.retsentry.providername = cabarets.retsprovider.name
             AND cabarets.retsentry.systemname = cabarets.retsprovider.lastupdatefield) AS foo
WHERE foo.valueTS <= now();

ただし、これを実行すると、エラーメッセージが表示されます。

[2013-01-09 14:04:30] [22007]エラー:タイプtimestampの入力構文が無効です: ""

サブクエリを単独で実行すると、次のようなデータが得られます...

SELECT
  systemid,
  cast(value AS TIMESTAMP) AS valueTS
FROM cabarets.retsentry, cabarets.retsprovider
WHERE cabarets.retsentry.providername = cabarets.retsprovider.name
      AND cabarets.retsentry.systemname = cabarets.retsprovider.lastupdatefield

これはこのような出力を与えます...

systemid    valuets
'4705683'   '2012-11-08 01:37:45'
'259534632' '2012-11-15 20:40:52'
'259536713' '2012-10-16 10:57:40'
'65815875'  '2012-10-28 22:36:00'
'259540896' '2012-10-16 09:59:22'
'4707500'   '2012-11-10 01:44:58'

Postgresでは、キャストされた文字列列のエイリアスである列に基づいてwhere句を追加できないという問題はありますか?

6
benstpierre

WHERE句をキャストしてみましたか?

_WHERE cast(foo.valueTS AS TIMESTAMP) <= now();
_

また、now()の代わりに_CURRENT_TIMESTAMP_を使用してみましたか?

他のデータの問題がない限り、他に何ができるかわかりません。

4
sgeddes

あなたの問題はあなたが無効なデータを持っているということです。これは、適切なデータ型を使用する重要な理由です。これにより、後で並べ替えるのではなく、入力時にエラーをキャッチできます。次のような修正を行うことができます。

UPDATE the_table
   SET value_ts = '1900-01-01 00:00:00'
 WHERE value_ts ~ '[ ]+';

これが問題であるならば、あなたがもっと見つけるだろうと私は心配しています。

1
Chris Travers