如何在 Redshift 中查找不能转换为日期的值?

How to find values that can't be cast as date in Redshift?

我有一大堆数据。我尝试解析一列以提取作为日期的子字符串并将其转换为日期 - date(<substring here>)。我收到错误 ERROR: Error converting text to date,但我不知道实际问题是什么。如何找到导致问题的值?类似于 try_cast,但这在 Redshift 中不起作用。我不确定我是否可以使用正则表达式,因为我不知道我要查找的内容的格式。

您的问题很宽泛,与您要解决的任务相比不是很具体,因此很难提供正确答案

  1. 您可以使用 pattern matching

比如说,你在TableA

中有以下数据
id dt
1 2020-08-20
2 2021-08-20
3 2021-08-21
4 2021-08-2000
5 asdfghjkl
6 08-01-2021
7 06/07/2021

通过模式匹配,您可以找到具有正确日期的所有行

select id from TableA 
where dt similar to '\d{4}-\d{2}-\d{2}'
  or dt similar to '\d{2}-\d{2}-\d{4}'
  or dt similar to '\d{2}/\d{2}/\d{4}'

您现在需要做的就是反转此查询以找到对立面

select id, dt from TableA
where id not in (
select id from logs.sot 
where dt similar to '\d{4}-\d{2}-\d{2}'
  or dt similar to '\d{2}-\d{2}-\d{4}'
  or dt similar to '\d{2}/\d{2}/\d{4}'
)

这会给你结果

id dt
5 asdfghjkl
4 2021-08-2000
  1. 如果这不起作用,您可以尝试按日期列排序并验证头部和尾部 - 错误值通常存在于此处

  2. 如果可能,请在 Redshift 外部进行处理。通常在将数据放入数据库之前注意数据清理是一种很好的做法。我相信一个简单的 python(或任何其他语言)脚本就能完成工作