在格式字段中在哪里使用FM修改器?

时间:2018-07-16 09:26:10

标签: sql postgresql postgresql-9.5

SELECT to_date(substring(data,126,8), 'YYYYMMDD'), 
       to_date(substring(data,185,8), 'YYYYMMDD'),
       to_date(substring(data,193,8), 'YYYYMMDD'),
       to_date(substring(data,201,8), 'YYYYMMDD'),
       to_timestamp(substring(data,31,19), 'YYYY-MM-DDBHH:MI:SS') 
FROM temp_table
WHERE substring(data,74,2)='H1';

这是mload中出现错误的代码

ERROR:  source string too short for "YYYY" formatting field  
DETAIL:  Field requires 4 characters, but only 0 remain.  
HINT:  If your source string is not fixed-width, try using the "FM" modifier.  

1 个答案:

答案 0 :(得分:0)

最容易解释错误的原因是子字符串与有效日期不匹配-例如,您认为您的子字符串返回“ 20180716”,但不是。

您应该做的第一件事是检查“数据”字符串的格式,并确保日期和时间戳与您认为的相符-即,字符串中位置31的正好是19个字符吗?尝试选择您要转换的子字符串,并确保它与您期望的匹配。

但是,我会说你在这里的做法非常冒险。您是否100%肯定地表示字符串每次都将返回相同的值,并且所有日期都位于同一位置?我本来可以使用正则表达式提供一个替代示例,但是在不知道“数据”字符串是什么样的情况下,我无法验证答案。 样本“数据”字符串将有助于提供更好的解决方案。