尝试在ANSI SQL中将VARCHAR转换/转换为DATETIME时出错

时间:2012-08-08 15:18:58

标签: sql postgresql teradata-aster

我在表中有一个列,其中时间戳已经以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). 

即使您使用getdate()等通用函数作为数据源,实际上也会发生CONVERT错误。这个数据库使用ANSI SQL-92(或者我告诉过)。有人可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

这看起来真的很痛苦,但以下情况应该有效:

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

我之前从未添加过datetime,但这只适用于SQL Server 2008。

为什么SQL Server不能支持围绕yyyy,mm,mmm,dd等构建的灵活符号?

实际数据库是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方法可以做到这一点。

答案 1 :(得分:0)

您使用了错误的语法,请尝试:

CONVERT(varchar(X), datetimeValue, 131) 

其中X是所需的字符总数。

然后,您将能够搜索与datetimeValueevent_timestamp的匹配项,假设每个值共享相同的结构。这将允许您将字符串与字符串匹配。

答案 2 :(得分:0)

如果我没弄错,标准(ANSI SQL)CAST运算符总是期望ISO格式的时间/日期/ timstamp文字('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');

虽然我不完全确定格式定义。您可能需要调整

顺便说一下:CONVERT不是标准的SQL函数。它是特定于SQL Server的。