我有一个表将一些数据类型存储为字符串。有时,此值是表示时间戳的字符串。以下查询用于在字段名(在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子句?
答案 0 :(得分:2)
您是否尝试过投射WHERE
子句:
WHERE cast(foo.valueTS AS TIMESTAMP) <= now();
您是否尝试过使用CURRENT_TIMESTAMP
代替now()
?
除非存在其他数据问题,否则不确定它可能是什么。
答案 1 :(得分:1)
您的问题是您的数据无效。这是使用适当数据类型的一个重要原因,因此您可以捕获输入错误而不是稍后进行排序。您可以执行以下操作来更正:
UPDATE the_table
SET value_ts = '1900-01-01 00:00:00'
WHERE value_ts ~ '[ ]+';
我很担心,如果这是问题,你会发现更多。