SQL Server时态表查询使用FOR SYSTEM_TIME AS OF...AT TIME ZONE报语法错误
错误原因及解决方法
问题分析
你的语法错误源于AT TIME ZONE不能直接附加在FOR SYSTEM_TIME AS OF的时间参数之后。FOR SYSTEM_TIME AS OF要求接收一个明确的datetime、datetime2或datetimeoffset类型值,而你试图在参数后直接嵌套时区转换逻辑,不符合SQL Server的语法规则。
正确写法
需要先完成时区转换,再将结果传入AS OF子句,以下是两种可行方式:
方式1:提前转换变量值
DECLARE @LocalTime DATETIMEOFFSET = '2021-09-01 10:00:00.7230011 -07:00'; -- 先将本地时间转换为UTC时区的datetimeoffset类型 DECLARE @UtcTime DATETIMEOFFSET = @LocalTime AT TIME ZONE 'UTC'; SELECT * FROM [vw_GetOrgChart] FOR SYSTEM_TIME AS OF @UtcTime;
方式2:在AS OF子句内直接转换
DECLARE @LocalTime DATETIMEOFFSET = '2021-09-01 10:00:00.7230011 -07:00'; SELECT * FROM [vw_GetOrgChart] FOR SYSTEM_TIME AS OF CONVERT(DATETIMEOFFSET, @LocalTime AT TIME ZONE 'UTC');
补充说明
AT TIME ZONE的核心作用是在不同时区间转换时间值:
- 若输入为
datetimeoffset类型,它会先将值转换为目标时区的对应时间,再返回datetimeoffset类型结果 - 你之前的写法错误在于把转换逻辑放在了
AS OF的参数范围外,SQL Server无法识别这种嵌套结构,必须保证AS OF后是单一、合法的时间类型表达式或变量。
内容的提问来源于stack exchange,提问作者Brian Holsen
相关产品推荐
相关产品推荐

