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
我有一个 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