timezone - 为什么 SQL Server 2017 无法识别 AT 时区?
问题描述
我在 SQL Server 2017 数据库(开发人员版)上运行以下查询。查询执行,但它只显示 getdate 值而没有实际转换。我还看到 SQL 编辑器没有以蓝色完全突出显示“AT TIME ZONE”,这意味着它可能无法识别。请问有什么想法吗?
SELECT
GETDATE() AT TIME ZONE 'Central Europe Standard Time' as CET,
GETDATE() AT TIME ZONE 'Cuba Standard Time' as 'Cuba Time'
PS:我检查了时区的定义和拼写是否正确
SELECT * FROM sys.time_zone_info
解决方案
似乎问题在于您对如何AT TIME ZONE
使用datetime
数据类型(即GETDATE()
返回的内容)的误解。采取以下措施:
DECLARE @DT datetime = '2020-01-17T16:39:01.123';
SELECT @DT AT TIME ZONE 'Central Europe Standard Time' as CET,
@DT AT TIME ZONE 'Cuba Standard Time' as [Cuba Time];
这将返回以下内容:
CET Cuba Time
---------------------------------- ----------------------------------
2020-01-17 16:39:01.123 +01:00 2020-01-17 16:39:01.123 -05:00
@DT
请注意,时间与时区以外的时间相同。这是因为datetime
时区不可知;它不知道存在。结果,时区只是简单地“添加”到值中。
但是,如果你使用 a datetimeoffset
,你会得到你期望的结果:
DECLARE @DT datetimeoffset(0) = '2020-01-17T16:39:01.123';
SELECT @DT AT TIME ZONE 'Central Europe Standard Time' as CET,
@DT AT TIME ZONE 'Cuba Standard Time' as [Cuba Time];
回报:
CET Cuba Time
---------------------------------- ----------------------------------
2020-01-17 17:39:01 +01:00 2020-01-17 11:39:01 -05:00
在您的情况下,这意味着您需要使用SYSDATETIMEOFFSET
:
SELECT SYSDATETIMEOFFSET() AT TIME ZONE 'Central Europe Standard Time' as CET,
SYSDATETIMEOFFSET() AT TIME ZONE 'Cuba Standard Time' as [Cuba Time];
对我来说,当我写下这个答案时,它会返回以下内容:
CET Cuba Time
---------------------------------- ----------------------------------
2020-01-17 17:43:55.5596303 +01:00 2020-01-17 11:43:55.5596303 -05:00
推荐阅读
- r - 重复一个向量以填充 r 中的一列
- types - 对参数超类型进行子类型化时,julia 类型不正确
- python - start_command() 缺少 1 个位置参数?
- java - RxJava - 使用 Single.Error / Observable.error 与抛出异常
- javascript - 有什么方法可以在反应中调用 useEffect 中的自定义钩子
- javascript - 存储一年中每个月的第一天和最后一天javascript
- python - 如何从具有特定值的 pandas DataFrame 数组列中选择行
- paypal - 如何使用 Google Pay 为我的在线服务自动收费
- javascript - 如何正确使用 webpack?
- regex - 为什么bash if =~ regex negate a character 不起作用