【问题标题】:Subtract hour using "Singapore Standard Time" timezone使用“新加坡标准时间”时区减去小时
【发布时间】:2022-02-12 21:35:38
【问题描述】:
select (convert(datetime ,SWITCHOFFSET(CONVERT(datetimeoffset, '2022-02-11 11:15:00.000'),
   (select current_utc_offset FROM sys.time_zone_info where name ='Singapore Standard Time')
))) CurrentTime

我怎样才能达到低于预期的效果?

当前结果:

CurrentTime
-----------------------
2022-02-11 19:15:00.000

预期结果:

CurrentTime
-----------------------
2022-02-11 03:15:00.000

PS:我不能在脚本中使用-8 或-08:00。

【问题讨论】:

  • 为什么不能在脚本中使用-8 或-08:00?有什么原因吗?
  • select convert(datetime , cast('2022-02-11 11:15:00.000' as datetime) at time zone 'Singapore Standard Time' at time zone 'utc') CurrentTime
  • @lptr 工作正常。谢谢!
  • @D-Shih 这是需求的一部分。谢谢!

标签: sql-server tsql datetime timezone datetime-conversion


【解决方案1】:

sys.time_zone_info 中的偏移量是从 UTC+00:00 切换到另一个时区的偏移量。

所以“新加坡标准时间”是 +08:00

但如果需要切换到UTC时区,可以更改符号。

SELECT (CONVERT(DATETIME, 
           SWITCHOFFSET(CONVERT(DATETIME, '2022-02-11 11:15:00.000'),
             (SELECT TRANSLATE(CURRENT_UTC_OFFSET,'+-','-+') FROM sys.time_zone_info WHERE name ='Singapore Standard Time')
     ))) AS CurrentTime

最好使用AT TIME ZONE 语法:

SELECT
  CONVERT(DATETIME, (CONVERT(DATETIME, '2022-02-11 11:15:00.000')
          AT TIME ZONE 'Singapore Standard Time'
          AT TIME ZONE 'UTC')) AS CurrentTime

两种方法都会返回相同的结果:

CurrentTime
2022-02-11 03:15:00.000

【讨论】:

  • 完美运行。谢谢!
  • 请注意,虽然新加坡目前固定为 UTC+8,但不能保证始终如此。但是,其他时区也会定期更改夏令时的偏移量或更改为标准时间。因此,应该避免查找 current 偏移并将其应用于任意时间戳的第一个代码示例。只有AT TIME ZONE 方法是正确的。
  • @MattJohnson-Pint 好点。但是sys.time_zone_info 是一个系统表。不知道它是否被 AT TIME ZONE 语法在幕后使用。但是,在同一个 MS Sql Server 版本中,差异可能是一致的,这并不让我感到惊讶。
  • 是同一个列表,但是转换时不使用该表。在该表中,当前偏移量是根据now 的日期时间动态预测的。它是当前对每个时区有效的偏移量。在该查询中转换的时间戳不一定是有效的偏移量,因此不应出于转换目的直接连接该表。
  • 另一种思考方式是,系统表应该仅用于确保时区 id 有效,或者用于查找时区列表。该列表中的当前偏移量对于排序或过滤列表很有用,但其他作用不大。
猜你喜欢
  • 1970-01-01
  • 2018-10-17
  • 1970-01-01
  • 1970-01-01
  • 2014-03-18
  • 2018-03-06
  • 2018-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多