将时间zonoffset值转换为varchar

时间:2013-12-13 17:35:34

标签: sql-server datetimeoffset timezone-offset

查询:

DECLARE @TimeZoneOffset datetimeoffset
SELECT @TimeZoneOffset  = Time_Zone_Offset 
FROM OFFSET_TABLE WHERE Active=1

Time_Zone_Offset列包含的值如-6:00(仅偏移)

当我SELECT @TimeZoneOffset时,它会抛出错误

  

从字符串转换日期和/或时间时转换失败。

我知道我做错了什么。我可能需要CONVERT/CAST但到目前为止无法获得o / p。

任何帮助

1 个答案:

答案 0 :(得分:1)

要想象这里发生了什么,试试这个:

DECLARE @x VARCHAR;
SET @x = 'abcdefghijklmnop';
SELECT @x;

结果:

----------
a

You have silently lost data from your variable, because you didn't bother declaring a length for your VARCHAR。在您的情况下,我认为您最终尝试在某处使用字符串-,而不是字符串-6:00

我不确定一个简单的SELECT如何产生你提到的错误;我怀疑你在其他未显示的环境中使用它。但是,一旦您的变量被正确声明,请再次尝试。

现在我明白为什么,你的问题不正确 - 你说你正在转换为VARCHAR但你没有。这并非真正意外,因为-6:00不是有效的DATETIMEOFFSET值;预计还会有 date time 组件,否则数据类型将被称为OFFSET。根据{{​​3}},有效DATETIMEOFFSET为:

DECLARE @d DATETIMEOFFSET = '1998-09-20 7:45:50.71345 -05:00';

所以也许你有一些日期时间值,你想要应用偏移量,你可以使用the documentation。但是-6:00不是有效值;它需要采用[+/-]hh:mm格式(注意上面的前导0,这似乎是样本数据中缺失的)。所以这是有效的:

DECLARE @datetime DATETIME = GETDATE(), @offset VARCHAR(6) = '-06:00';
SELECT SWITCHOFFSET(@datetime, @offset);

您需要更正偏移表中的数据,并且需要更改使用输出的方式。就个人而言,我发现更容易远离DATETIMEOFFSETSWITCHOFFSET(),尤其是因为它们不支持DST。我有更好的运气使用日历表进行偏移,以几分钟存储偏移量,并使用DATEADD在时区之间切换。 YMMV。