11

我有一个将许多数据类型存储为字符串的表。有时该值是表示时间戳的字符串。以下查询旨在在字段名(在 RetsProvider 中指定)上连接 RetsEntry 和 RetsProvider 表,然后过滤掉条目时间戳介于两次之间的“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] 错误:时间戳类型的输入语法无效:“”

当我自己运行子查询时,我得到这样的数据......

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 子句的问题是什么?

4

2 回答 2

7

您是否尝试过强制转换您的WHERE条款:

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

您是否也尝试过使用CURRENT_TIMESTAMP 而不是now()

除非有其他数据问题,否则不确定它可能是什么。

于 2013-01-09T21:18:13.623 回答
1

您的问题是您的数据无效。这是使用适当数据类型的一个重要原因,这样您就可以在输入时捕获错误,而不是稍后再进行整理。您可以执行以下操作来更正:

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

我担心,如果这是问题,你会发现更多。

于 2013-04-20T07:38:58.293 回答