Redshift не может преобразовать строку в дату, пробовал несколько функций

У меня есть таблица с полем под названием ADATE, это VARCHAR(16) и значения такие: 2019-10-22-09:00.

Я пытаюсь преобразовать это в тип DATE, но не могу заставить это работать.

Я пытался:

1

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

Не удается преобразовать дату типа базы данных в строку

2

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

Не удается преобразовать дату типа базы данных в строку

3

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

XX000: неверная цифра, значение '-', позиция 4, тип: десятичный

4

CAST(ADATE AS DATE)

Ошибка преобразования текста в дату

5

CAST(LEFT(ADATE, 10) AS DATE)

Ошибка преобразования текста в дату

6

CAST(TRUNC(ADATE) AS DATE)

Ошибка преобразования числа в дату


person Matt    schedule 01.05.2020    source источник


Ответы (2)


Проблема заключалась в том, что данные содержали пробелы (не нули), поэтому ошибка была вокруг них.

Я решил это, используя следующий код:

TO_DATE(LEFT(CASE WHEN adate = '' THEN NULL ELSE adate END, 10), 'ГГГГ-ММ-ДД') adate

person Matt    schedule 04.05.2020

Очевидно, у вас есть неверные строковые значения даты, поэтому для начала значение должно храниться как дата.

Я не думаю, что у 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-й месяц не разрешен, но он, вероятно, поймает ошибки.

person Gordon Linoff    schedule 01.05.2020
comment
Это дает каждому полю значение NULL. - person Matt; 01.05.2020
comment
@Мэтт. . . Я пропустил последние три символа. Это использует left(), чтобы учитывать только часть даты строки. - person Gordon Linoff; 01.05.2020
comment
Разве регулярное выражение не должно быть: '^(19|20)[0-9][0-9]-[0-1][0-9]-[0-3][0-9]$' . .. день может быть от 1 до 31, поэтому я предполагаю, что он должен быть [0-3][[0-9]? - person Ash_s94; 28.07.2020
comment
@Ash_s94 . . . Спасибо. - person Gordon Linoff; 28.07.2020