PostgreSQL:通过Select Substring忽略/加载Null Dates

时间:2016-10-19 18:09:55

标签: sql postgresql date

我无法获得固定宽度的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;

有谁能帮忙告诉我我做错了什么?

2 个答案:

答案 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值可以是truefalse,因此您需要将is_date()的结果与之比较。 1不是布尔值。

您实际上可以完全忽略= truewhen is_date(..) then ..完全没问题。