从全球化日期/时间格式(可能是ISO8601)转换为SQL Server日期时间类型

从全球化日期/时间格式(可能是ISO8601)转换为SQL Server日期时间类型,sql,sql-server-2005,timezone,globalization,Sql,Sql Server 2005,Timezone,Globalization,是否有一种字符串格式来表示SQL能够解析并转换为另一个偏移量的日期时间(例如EST->UTC) 我有一个来自用户的字符串,例如: declare @p1 varchar(50); declare @utcDateTime datetime; set @p1 = "2009-06-26 14:30:00.000Z-4:00"; -- could be ISO8601 -- what do I do here to convert @p1? set @utcDateTime = -- sh

是否有一种字符串格式来表示SQL能够解析并转换为另一个偏移量的日期时间(例如EST->UTC)

我有一个来自用户的字符串,例如:

declare @p1 varchar(50);
declare @utcDateTime datetime;

set @p1 = "2009-06-26 14:30:00.000Z-4:00";   -- could be ISO8601

-- what do I do here to convert @p1?

set @utcDateTime = -- should be "2009-06-26 18:30:00.000"
我希望能够将字符串转换为UTC等效值,并将其存储在datetime字段中。以便:

select @ utcDateTime 
应产生以下结果:

"2009-06-26 18:30:00.000"
换句话说,给定第一个字符串,我想存储一个值为'2009-06-26 18:30'的datetime

此外,我们必须假设服务器与用户不在同一时区(因此我们不能只检测偏移量datediff(gettime(),getutctime())

我尝试过使用convert(…)和cast(…作为日期时间),但没有成功


在SQL Server 2005中有这样做的方法吗?

如果您使用的是datetimes,则有一种方法 在窗口中运行此命令

declare @date varchar(100)
select @date = '2009-06-26 14:30:00.000'

select dateadd(hh,datediff(hh,getdate(),getutcdate()),@date)
输出 2009-06-26 18:30:00.000

最好一直使用getutcdate()并将用户偏移量存储在他的配置文件中

SQLServer2008有了新的数据类型,这使它更容易实现

现在,这里有一个答案,它将与您拥有的数据一起工作(我还添加了1/2小时的代码)

下面解释代码的工作原理:


如果您使用的是datetimes,则为单向 在窗口中运行此命令

declare @date varchar(100)
select @date = '2009-06-26 14:30:00.000'

select dateadd(hh,datediff(hh,getdate(),getutcdate()),@date)
输出 2009-06-26 18:30:00.000

最好一直使用getutcdate()并将用户偏移量存储在他的配置文件中

SQLServer2008有了新的数据类型,这使它更容易实现

现在,这里有一个答案,它将与您拥有的数据一起工作(我还添加了1/2小时的代码)

下面解释代码的工作原理:


好的,这是我的尝试-这很有趣:-)

返回:

2009-06-26 14:30:00.000Z+4:00  2009-06-26 10:30:00.000

2009-06-26 14:30:00.000Z-4:00  2009-06-26 18:30:00.000

2009-06-26 14:30:00.000Z+14:00 2009-06-26 00:30:00.000

2009-06-26 14:30:00.000Z+4:30  2009-06-26 10:00:00.000

2009-06-26 14:30:00.000Z-4:30  2009-06-26 19:00:00.000

2009-06-26 14:30:00.000Z+14:30 2009-06-26 00:00:00.000

好的,这是我的尝试-这很有趣:-)

返回:

2009-06-26 14:30:00.000Z+4:00  2009-06-26 10:30:00.000

2009-06-26 14:30:00.000Z-4:00  2009-06-26 18:30:00.000

2009-06-26 14:30:00.000Z+14:00 2009-06-26 00:30:00.000

2009-06-26 14:30:00.000Z+4:30  2009-06-26 10:00:00.000

2009-06-26 14:30:00.000Z-4:30  2009-06-26 19:00:00.000

2009-06-26 14:30:00.000Z+14:30 2009-06-26 00:00:00.000

将数据存储为datetime有什么问题?给定的字符串无法转换;SQL Server出现以下错误:“从字符串转换日期时间时转换失败。”“可能是ISO”,或者是ISO?最好选择一种格式。我的意思是,我可以告诉用户使用哪种格式-我会选择ISO 8601。将数据存储为日期时间有什么问题?给定的字符串无法转换;SQL Server出现以下错误:“从字符串转换日期时间时转换失败。”“可能是ISO”,或者是ISO?最好选择一种格式。我的意思是,我可以告诉用户使用哪种格式-我会选择ISO8601。太好了!这管用!我希望它不会看起来那么难看,但不管怎样。这也要求字符串具有一定的长度,但无论如何,我正在验证字符串模式。太好了!这管用!我希望它不会看起来那么难看,但不管怎样。这也要求字符串具有一定的长度——但无论如何,我都要在输入的过程中验证字符串模式。