【问题标题】:SQL datetime valueSQL 日期时间值
【发布时间】:2010-12-06 03:23:01
【问题描述】:

我在 varchar 变量中的数据格式为“2009-07-17T00:00:00-05:00”。如何使用查询或 TSQL 将此数据转换为 MS SQL 服务器中的日期时间字段?

【问题讨论】:

  • 最后-05:00 是什么?某种形式的毫秒?
  • 所有字段都是like '%-05:00'吗?可能必须使用字符串函数转换为常规日期时间。

标签: sql sql-server sql-server-2005 tsql datetime


【解决方案1】:

如果您使用的是 SQL Server 2008,则可以使用 datetimeoffset 类型:

select cast('2009-07-17T00:00:00-05:00' as datetimeoffset)

由于您是 2005 年,datetimeoffset 数据类型对您不可用。您应该决定是否要单独保留时区信息。如果您只想要datetime 部分,只需从字符串中剥离时区部分并将其转换为datetime

select cast(left('2009-07-17T00:00:00-5:00', 19) as datetime)

【讨论】:

  • 不知何故它不起作用。显示“类型 datetimeoffset 不是已定义的系统类型。”我该怎么办?
  • 您使用的是什么 SQL Server 版本? datetimeoffset 是 2008 年的新成员。
  • Microsoft SQL Server 2005 - 9.00.1406.00 (X64) Mar 3 2007 19:53:24 版权所有 (c) 1988-2005 Microsoft Corporation Enterprise Edition (64-bit) o​​n Windows NT 5.2 (Build 3790) : 服务包 2)
【解决方案2】:

转换为 DATETIME 不起作用,但该格式是有效的 XML 日期时间格式,因此您可以先通过 XML 类型路由转换:

declare @d varchar(50);
select @d = '2009-07-17T00:00:00-05:00';

select x.value(N'.', N'datetime') from (select cast(@d as xml) as x) as t;

【讨论】:

  • 是的。此数据来自 XML 文件。我使用 SELECT [StartDate] FROM OPENXML(@iTree, '/List/DailyUpdate', 2) WITH ([STARTDATE] varchar(50)) 任何方式在 SQL 中做到这一点?我试过 datetime 它不起作用...
  • 你能用 XML 方法代替 OPENXML 吗? OPENXML 是一只恐龙……只要说SELECT xmlfield.value(N'(/List/Daily/Update)[1]', N'datetime') FROM table。使用 OPENXML,您需要使用 WITH 语法来指定返回的架构并将 StartDate 映射到日期时间:SELECT StartDate FROM OPENXML(...) WITH (StartDate DATETIME)
  • 答案中的查询也一直显示“从字符串转换日期时间时转换失败。”有什么想法吗?
  • select x.value(N'.', N'datetime') from (select cast(@d as xml) as x) as t;
  • 我在发布之前在 SQL 2008 上测试了我的查询,但实际上 SQL 2005 XQuery/XPath 解析器无法识别时区信息。不幸的是,这会让你回到基于字符串截断的解决方案,就像 Mehrdad 建议的那样。
猜你喜欢
  • 1970-01-01
  • 2016-03-05
  • 1970-01-01
  • 2016-09-19
  • 2019-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多