我在表中有一个列,其中时间戳已经以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(或者我告诉过)。有人可以帮我解决这个问题吗?
答案 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是所需的字符总数。
然后,您将能够搜索与datetimeValue
和event_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的。