Redshift не может преобразовать строку в дату, перепробовал несколько функций - PullRequest
0 голосов
/ 01 мая 2020

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

Я пытаюсь преобразовать этот тип do 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: недопустимое значение di git, значение '-', Pos 4, тип: десятичное число

4

CAST(ADATE AS DATE)

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

5

CAST(LEFT(ADATE, 10) AS DATE)

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

6

CAST(TRUNC(ADATE) AS DATE)

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

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

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

Я решил эту проблему с помощью следующего кода:

TO_DATE (LEFT (CASE WHEN adate =) '' ПОСЛЕ ТОГО, ЧТО ЕЩЕ НЕДОСТАТОЧНО адаты END, 10), "ГГГГ-ММ-ДД") адаты

0 голосов
/ 01 мая 2020

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

Я не думаю, что в Redshift есть способ проверки даты перед попыткой сравнение или избежание ошибки. Но вы можете использовать case и регулярные выражения, чтобы увидеть, является ли значение разумным. Это может помочь:

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

Это не точно. , , Вы можете сделать его более сложным, чтобы 19-й месяц не был разрешен (например), но, скорее всего, он обнаружит ошибки.

...