所以我有一列 incarceration_date,它实际上是一个文本字段,我想将其转换为日期。通常没有问题,但似乎此列中的每个值末尾都有一个不间断空格( ),这当然会导致日期函数错误。
我尝试了两种不同的方法来解决这个问题,但没有成功。
尝试1:
trim(both chr(65279) from incarceration_date)::DATE
尝试2:
regexp_replace(incarceration_date, '\s+$', '')::DATE
我认为第二次尝试失败,因为 [[:space:]] 不包含零宽度不间断空格。
在这个特定的实例中,字段都具有相同的宽度,因此我可以通过仅将前十个字符传递给日期函数来解决这个问题。但是,我确实有一些用于导入数据的通用文本清理函数,我希望它们能够处理这个字符。
示例字符串如下所示:
"06/17/2011 "
但我不确定问题字符是否正确复制到SO。
我正在使用 PostgreSQL-9.5.0。
通过encode(incarceration_date::bytea, 'hex')输出的incarceration_date列一行的输出为:
30362f31372f32303131c2a0
所有行均以
c2a0
结尾。
服务器编码为UTF8。
我在删除不间断空格时也遇到了同样的问题。
这将显示不间断字符,寻找“C2 A0”
encode(convert_to(>>your_field<<, 'UTF-8'), 'hex')
我正在使用此功能删除“C2 A0”字符:
regexp_replace(>>your_field<<,'\xa0','')
正如@ThiefMaster所说,你可能最好删除除数字和斜杠之外的任何东西,以防万一字段中有任何其他垃圾:
regexp_replace(incarceration_date, '[^0-9/]', '')::DATE
或者,为了提高性能,如果您知道日期的格式始终为
DD/MM/YYYY
,则为 just use left(incarceration_date, 10)
,甚至 incarceration_date::char(10)
。