查询:
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。
任何帮助
答案 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);
您需要更正偏移表中的数据,并且需要更改使用输出的方式。就个人而言,我发现更容易远离DATETIMEOFFSET
和SWITCHOFFSET()
,尤其是因为它们不支持DST。我有更好的运气使用日历表进行偏移,以几分钟存储偏移量,并使用DATEADD
在时区之间切换。 YMMV。