1

我在一个表中有一个列,其中时间戳已以 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(或者我被告知)。谁能帮我解决这个问题?

4

3 回答 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

我以前从未添加过日期时间,但这仅适用于 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 方法可以做到这一点。

于 2012-08-08T15:55:26.130 回答
0

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

CONVERT(varchar(X), datetimeValue, 131) 

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

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

于 2012-08-08T15:29:16.277 回答
0

如果我没记错的话,标准(ANSI SQL)CAST 运算符总是期望 ISO 格式的时间/日期/时间戳文字('YYYY-MM-DD')

但是根据Teradata V12的手册(无法测试),CAST运算符的格式是

CAST(character_expression AS TIMESTAMP timestamp_data_attribute)

date_data_attribute一个字符值加上一个可选的格式说明符。

所以在你的情况下,这可能是:

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

不过,我并不完全确定格式定义。你可能需要调整它

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

于 2012-08-08T16:31:53.927 回答