我无法获得固定宽度的Insert Into语句来正确处理日期字段。我在这里找到了一些代码来创建一个“is_date”函数,但不知道如何使PostgreSQL pgAdminIII SQL Query窗口识别它。
错误:函数is_date(日期)不存在
我在StackOverflow上的另一篇文章中找到了什么:
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 :(得分:0)
您使用的to_date()
会在date
期望字符串时返回is_date()
。 PostgreSQL不进行自动转换,在这种情况下检查日期是否为日期是愚蠢的,因为它不是其他任何东西。从to_date()
来电中删除is_date()
。
答案 1 :(得分: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
值可以是true
或false
,因此您需要将is_date()
的结果与之比较。 1
不是布尔值。
您实际上可以完全忽略= true
,when is_date(..) then ..
完全没问题。