Ошибки при попытке привести / преобразовать 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.