Ошибки при попытке привести / преобразовать VARCHAR в DATETIME в ANSI SQL

У меня есть столбец в таблице, где временные метки были сохранены в формате VARCHAR, но мне нужно сравнить их со столбцом значений DATETIME из другой таблицы, чтобы найти временные интервалы, поэтому я хочу преобразовать или преобразовать временные метки VARCHAR в DATETIME. Однако, как кастинг, так и конвертация доставляют мне проблемы.

Формат временной метки VARCHAR выглядит следующим образом: "29/07/2012 01:53:36 +12",

Используя запрос:

SELECT CAST(event_timestamp AS datetime) FROM the_table

производит ERROR: date/time field value out of range: "29/07/2012 01:53:36 +12",

Используя запрос:

SELECT CONVERT(datetime, event_timestamp, 131) from the_table;

производит

ERROR:  syntax error at or near ","
LINE 1: select CONVERT(datetime, event_timestamp, 131) from the_tab...
                               ^ (note: this is pointing at the first comma). 

Ошибка с CONVERT на самом деле происходит, даже если вы используете универсальную функцию, такую ​​как getdate() для источника данных. Эта база данных использует ANSI SQL-92 (или мне так сказали). Может ли кто-нибудь помочь мне с этим?

3 ответа

Решение

Это кажется действительно болезненным, но следующее должно работать:

select dateadd(hh, cast(right(tv, 3) as int),
               CONVERT(datetime, left(tv, 10), 103)+CONVERT(datetime, substring(tv, 12, 8), 108)
              )
from (select '29/07/2012 01:53:36 +12' as tv) t

Я никогда не добавлял дату и время, но это работало только на SQL Server 2008.

Почему SQL Server не может просто поддерживать гибкую нотацию, построенную вокруг гггг, мм, ммм, дд и так далее?

Фактическая база данных - Aster Data, основанная на Postgres (как и самые последние движки баз данных). В этой базе данных вы бы использовали to_timestamp(). См. Документацию здесь http://www.postgresql.org/docs/8.2/static/functions-formatting.html. Вызов будет что-то вроде:

to_timestamp(val, 'MM/DD/YYYY HH:MI:SS tz') -- not sure if this gets the +12

Для преобразования даты нет никаких функций ANSI, поэтому каждая база данных работает самостоятельно. Даже строковые функции различаются в разных базах данных (substr? Substring? Charindex? Instr? Location?), Поэтому ANSI-способа для этого нет.

Вы используете неправильный синтаксис, попробуйте:

CONVERT(varchar(X), datetimeValue, 131) 

Где X - общее количество желаемых символов.

После этого вы сможете найти совпадение с datetimeValue а также event_timestampпри условии, что каждое значение имеет одинаковую структуру. Это позволит вам сопоставить строку со строкой.

Если я не ошибаюсь, стандартный оператор (ANSI SQL) CAST всегда ожидает литералы времени / даты /timstamp в формате ISO ('YYYY-MM-DD')

Но согласно руководству для Teradata V12 (не могу его протестировать), формат оператора CAST

CAST(character_expression AS TIMESTAMP timestamp_data_attribute)

с date_data_attribute будучи символьным значением плюс необязательный спецификатор FORMAT.

Так что в вашем случае это, вероятно, будет:

cast(event_timestamp AS TIMESTAMP FORMAT 'MM/DD/YYYY HH:MI:SS Z');

Я не совсем уверен насчет определения формата. Вы, вероятно, должны будете отрегулировать это

Btw: CONVERT не является стандартной функцией SQL. Это специфично для SQL Server.

Другие вопросы по тегам