2016-10-19 34 views
0

我无法获得固定宽度的Insert Into语句以正确处理日期字段。我在这里发现了一些代码来创建一个“is_date”函数,但不知道如何让PostgreSQL pgAdminIII SQL Query窗口识别它。PostgreSQL:通过选择子字符串忽略/加载空日期

Error: function is_date(date) does not exist

我在另一篇文章发现在计算器上什么:

create or replace function is_date(s varchar) returns boolean as $$ 
begin 
    perform s::date; 
    return true; 
exception when others then 
    return false; 
end; 
$$ language plpgsql; 

我写的,有很多的帮助!

CREATE TABLE marc (statusdate date); 
INSERT INTO marc (statusdate) 
SELECT CASE 
      WHEN is_date(to_date(substring(data,228,60), 'DD/MON/YYYY')) = 1 
      THEN to_date(substring(data,228,60), 'DD/MON/YYYY') 
      ELSE NULL 
     END As statusdate 
FROM marctemp; 

任何人都可以告诉我我做错了什么?

回答

0

您正在使用的to_date()它返回date而您的is_date()需要一个字符串。 PostgreSQL不会执行自动转换,在这种情况下,检查日期是否为日期是很愚蠢的,因为它不能成为其他任何日期。从is_date()呼叫中删除to_date()

0

错误消息告诉你所有你需要知道:你是传递一个date给需要一个varchar

CREATE TABLE marc (statusdate date); 
INSERT INTO marc (statusdate) 
SELECT CASE 
      WHEN is_date(substring(data,228,60)) = true 
      THEN to_date(substring(data,228,60), 'DD/MON/YYYY') 
      ELSE NULL 
     END As statusdate 
FROM marctemp; 

boolean值可以是truefalse,所以你需要比较的is_date()结果的函数对此。 1不是布尔值。

你实际上可以完全省去= truewhen is_date(..) then ..是完全没问题的。

+0

有道理,谢谢。我是否要求在此跟进或编辑原文?现在获取新的/不同的错误。 –

+0

如果您有新问题,请提出新问题。每次得到答案后都不要改变你最初的问题。您可以链接到新问题中的这个问题。 –

+0

不,没有更多的错误,太快阅读你的文章。再次感谢你,这是非常有意义的,并按照设计工作。非常感谢,我对这一切都很新颖,每一项新任务都像是自己的研究项目。 –