Redshift 无法将字符串转换为日期,尝试了多个函数

Redshift can't convert a string to a date, tried multiple functions

我有一个 table,其中有一个名为 ADATE 的字段,它是一个 VARCHAR(16),值如下所示:2019-10-22-09:00.

我正在尝试将其转换为 DATE 类型,但无法正常工作。

我试过:

1

TO_DATE(ADATE, 'YYYY-MM-DD')

Can't cast database type date to string

2

TO_DATE(LEFT(ADATE, 10), 'YYYY-MM-DD')

Can't cast database type date to string

3

TO_DATE(TRUNC(ADATE), 'YYYY-MM-DD')

XX000: Invalid digit, Value '-', Pos 4, Type: Decimal

4

CAST(ADATE AS DATE)

Error converting text to date

5

CAST(LEFT(ADATE, 10) AS DATE)

Error converting text to date

6

CAST(TRUNC(ADATE) AS DATE)

Error converting numeric to date

显然,您的日期字符串值不正确——这就是为什么应该将该值存储为日期开头的原因。

我认为 Redshift 无法在尝试比较之前验证日期或避免错误。但是可以用case和正则表达式来判断这个值是否合理。这可能有帮助:

(case when left(adate, 10) ~ '^(19|20)[0-9][0-9]-[0-1][0-9]-[0-3][0-9]$'
      then to_date(left(adate, 10), 'YYYY-MM-DD')
 end)

这不准确。 . .您可以使其更复杂,因此不允许使用第 19 个月(例如),但它很可能会发现错误。

问题是数据包含空白(不是空值),所以错误就在它们附近。

我使用以下代码解决了这个问题:

TO_DATE(LEFT(CASE WHEN adate = '' THEN NULL ELSE adate END, 10), 'YYYY-MM-DD') adate