在 Teradata 中将字符串转换为日期的问题

Problem with converting character string to date in Teradata

Teradata 相对较新。我有一个 table 似乎是从 Excel 导入的,所有内容都是字符。我正在尝试将字符时间戳转换为时间戳或日期——只要我可以计算时间间隔(天、月、年)我并不真正关心最小错误(1 天)不是什么大问题在这种情况下处理。

它们目前的格式为 MM/DD/YYYY HH:MM:SS AM/PM,但在 1 月至 9 月的几个月中,它们缺少前导 0。例如,

2020 年 6 月 3 日 5:19:11 下午

2020 年 11 月 13 日 11:37:12 上午

这会导致 TO_DATE(当我仅提取日期部分时)和 TO_TIMESTAMP 等函数出现问题。我用谷歌搜索并查看了 Whosebug,虽然我找到了答案,但令我惊讶的是我没有找到任何对我的情况有帮助的东西(这不可能是独一无二的)。

这是我尝试过的和得到的:

TO_DATE(TRIM(SUBSTR(ACTVTY_TIMESTAMP, 0, LENGTH(ACTVTY_TIMESTAMP) - 10))) AS newdate

作为单一语句执行。失败 [9134 : HY000] YYYY 值必须是四位数字并且在 1-9999

范围内
TO_DATE(TRIM(SUBSTR(ACTVTY_TIMESTAMP, 0, LENGTH(ACTVTY_TIMESTAMP) - 10)), 'MM/DD/YYYY') AS newdate

作为单一语句执行。失败 [9134 : HY000] 月份必须是两位数长

我见过一些类似的情况,人们建议使用 case when 语句或正则表达式。我认为必须有一个简单的解决方案,因为这似乎很常见。

如果有人能提供任何指导,我将不胜感激。

非常感谢, 布莱恩

您可以使用正则表达式在需要的地方添加前导 0。

select cast(regexp_replace('6/3/2020 5:19:11 PM', '\b([0-9])\b', '0') AS TIMESTAMP(0) Format 'mm/dd/yyyyBhh:mi:ssbT')

那将 return 2020-06-03 17:19:11。