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

问题描述 投票:1回答:3

我在表中有一列,其中时间戳以VARCHAR格式存储,但是我需要将它们与另一张表中的DATETIME值列进行比较以找到时间间隔,因此我想将VARCHAR时间戳转换或转换为约会时间。但是,转换和转换都给我带来了问题。

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(或者有人告诉我)。谁能帮我这个忙吗?

sql teradata-aster
3个回答
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等构建的灵活表示法?

实际数据库是基于Postgres的Aster Data(与最新的数据库引擎一样)。在此数据库中,您将使用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方法可以做到这一点。

0
投票
您使用的语法错误,请尝试:

CONVERT(varchar(X), datetimeValue, 131)

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

然后您将能够搜索与datetimeValueevent_timestamp匹配的项,假设每个值都具有相同的结构。这将使您可以将字符串与字符串进行匹配。


0
投票
如果我没记错的话,标准(ANSI SQL)CAST运算符总是期望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的。

© www.soinside.com 2019 - 2024. All rights reserved.