0

所以我有一个列 incarceration_date,它实际上是一个文本字段,我想将其转换为日期。通常没问题,但似乎此列中的每个值最后都有一个不间断空格( ),这当然会导致日期函数错误。

我尝试了两种不同的方法来解决这个问题,但没有成功。

尝试1:

trim(both chr(65279) from incarceration_date)::DATE

尝试2:

regexp_replace(incarceration_date, '\s+$', '')::DATE

我认为第二次尝试失败是因为 [[:space:]] 不包括零宽度不间断空间。

在这个特定的例子中,这些字段的宽度都是一样的,所以我可以通过只将前十个字符传递给 date 函数来解决这个问题。但是,我确实有一些用于导入数据的通用文本清理功能,我希望它们能够处理这个字符。

示例字符串如下所示:

"06/17/2011 "

但我不确定问题字符是否正确复制到 SO。

我正在使用 PostgreSQL-9.5.0。

通过 encode(incarceration_date::bytea, 'hex') 输出的 incarceration_date 列的一行输出为:

30362f31372f32303131c2a0

所有行都以c2a0.

服务器编码为 UTF8。

4

2 回答 2

0

正如@ThiefMaster 所说,您最好删除除数字和斜杠以外的任何内容,以防万一您在该字段中有任何其他垃圾:

regexp_replace(incarceration_date, '[0-9/]', '')::DATE

或者,为了提高性能,如果您知道日期的格式总是像DD/MM/YYYY, then just use left(incarceration_date, 10), 甚至incarceration_date::char(10).

于 2016-04-06T00:31:21.193 回答
0

我在删除不间断空格时也遇到了同样的问题。

这将显示非中断字符,查找“C2 A0”

encode(convert_to(>>your_field<<, 'UTF-8'), 'hex')

我正在使用此功能删除“C2 A0”字符:

regexp_replace(>>your_field<<,'\xa0','')
于 2018-05-07T08:57:26.710 回答