如何在 SAP SQL Anywhere 中将 UTC 时间戳转换为命名时区?
Posted
技术标签:
【中文标题】如何在 SAP SQL Anywhere 中将 UTC 时间戳转换为命名时区?【英文标题】:How to convert a UTC timestamp to a named timezone in SAP SQL Anywhere? 【发布时间】:2021-12-23 10:05:00 【问题描述】:我正在使用 SAP SQL Anywhere 17 并且有一个我知道是 UTC 的时间戳(没有时区),并且我知道我的客户端浏览器报告的时区是“欧洲/柏林”。
有没有一种简单的方法可以使用 SQL 将 UTC 时间戳转换为该时区的本地时间戳?假设我已经有created the timezone
CREATE TIME ZONE "Europe/Berlin" OFFSET '01:00' DST OFFSET '01:00' DST STARTING 'Mar/last Sun' AT '02:00' DST ENDING 'Oct/last Sun' AT '02:00';
我想可以使用 SYSTIMEZONE 视图手动执行此操作,但处理所有特殊情况需要几个小时的艰苦工作!也许有人已经这样做了,或者 Anywhere 提供了我在文档中忽略的系统功能。
请注意,问题在于找出 DST 在任意 UTC 时间戳是否处于活动状态。例如,如果时间戳是未来 6 个月,则仅使用 当前 偏移量会产生错误的结果!
【问题讨论】:
【参考方案1】:在您的服务器上激活时区后,您有一个名为 TimeZoneAdjustment
的连接属性,它返回相对于 UTC 的 分钟 数。对于欧洲/柏林,这是“60”(冬季时间/标准时间)。
您可以使用DATEADD
函数手动添加该偏移量:
SELECT CURRENT UTC TIMESTAMP AS my_utc_timestamp,
DATEADD(minute, CONNECTION_PROPERTY('TimeZoneAdjustment'), my_utc_timestamp) AS localtime
较新版本的 SQL Anywhere 17 有一个新函数 TOLOCALDATE
,它会自动将当前连接的偏移量应用于 UTC 时间戳(尽管我无法测试该函数,因为我的版本太旧了)。
【讨论】:
此函数使用 current 时区偏移量,因此使用它来转换任意时间戳(可能是 6 个月前或将来)是不正确的,因为夏令时状态,因此以分钟为单位的偏移量可能与今天的偏移量不同。以上是关于如何在 SAP SQL Anywhere 中将 UTC 时间戳转换为命名时区?的主要内容,如果未能解决你的问题,请参考以下文章
MySQL mobilink 与 SQL Anywhere 同步
Sybase SQL Anywhere:LOAD TABLE 函数是不是在存储过程中工作?
sql SQL Anywhere:Mostrar Tablas y Campos de la Base de Datos