如何使 Amazon Redshift 中的 TO_DATE 在同一列中使用多种日期格式?

How can I make TO_DATE in Amazon Redshift work with multiple date formats in the same column?

我有一个包含日期时间值的字符串列,我需要将其转换为日期以计算密集排名。

此列可以采用以下 3 种格式中的任何一种:

MM-DD-YYYY H:MM:SS PM
M-DD-YYYY H:MM:SS PM
MM-D-YYYY H:MM:SS PM

我的 SQL 计算密集排名的语句基于这个日期时间列,我需要将其转换为日期以便降序排列:

DENSE_RANK() 
OVER (PARTITION by [columnA] ORDER BY
TO_DATE(SUBSTRING([dateColumn],0,8), 'MM-DD-YYYY') DESC)

但是,我无法使用 TO_DATE 函数,因为我在同一列中有三种不同的格式。

如何使 Amazon Redshift 中的 TO_DATE 在同一列中使用多种日期格式?

而不是使用 SUBSTRING,将整个 date-time 字段传递给具有 MM-DD-YYYY 格式的 TO_DATE 函数,该格式封装了上述所有 3 种格式.

Redshift 有一个默认关闭的严格模式 - TO_DATE(string, format, is_strict=false)。当不在严格模式下时,时间会自动被丢弃& Redshift 足够聪明,可以推断如何将个位数转换为双位数。

您的其余代码可以正常工作。

演示:

--MM-DD-YYYY H:MM:SS PM
SELECT TO_DATE('05-15-2022 4:12:34 PM','MM-DD-YYYY');
--M-DD-YYYY H:MM:SS PM
SELECT TO_DATE('4-01-2022 8:45:06 PM','MM-DD-YYYY');
--MM-D-YYYY H:MM:SS PM
SELECT TO_DATE('04-9-2022 6:23:10 PM','MM-DD-YYYY');

输出:

2022-05-15
2022-04-01
2022-04-09

对于您的情况,这应该有效:

DENSE_RANK()
OVER (partition BY [columnA] ORDER BY 
TO_DATE(datecolumn, 'MM-DD-YYYY') DESC)

P.S。首先,这些日期都应该采用相同的格式。

如果您负责生成数据,请仅以一种格式输出日期,以便让每个人的生活更轻松!