【问题标题】:How does Sybase handle time zones?Sybase 如何处理时区?
【发布时间】:2014-07-03 13:08:19
【问题描述】:

我需要了解 Sybase 如何处理和存储时区:

例如,如果 JDBC 客户端位于时区 +1:00,而 Sybase DB 位于时区 +2:00:

  1. 当 JDBC 客户端应用程序写入数据库(例如 INSERT/UPDATE)时,Sybase 是否会将从客户端应用程序接收到的日期时间转换为其本地时区,并将其存储在 db 表中?
  2. 当 JDBC 客户端应用程序从数据库中读取数据时,Sybase 结果集是否会包含带有 SELECT 查询的客户端或服务器的时区?
  3. 如果数据库服务器盒后来被移动到另一个国家,例如在 +3:00 时区,存储在 Sybase 数据库中的日期时间值是否会与移动后插入的日期时间不一致?

考虑到上述情况,我什么时候需要转换日期/时间,应该将其转换为服务器时区还是客户端时区?

【问题讨论】:

  • 实验,你会发现自己的答案。或阅读文档。您可能会发现行为因数据类型而异。
  • 很遗憾,我没有可以试验的免费 Sybase 数据库服务器。我也不是 DBA,这就是我问这个问题的原因。

标签: jdbc timezone sybase sap-ase


【解决方案1】:

Sybase ASE 将存储客户端应用程序传递给它的任何时间戳。它假定应用程序知道它在做什么,并且不会进行任何转换。

这意味着写入和读取的数据将基于客户端应用程序的时区,而不是数据库服务器的时区。

这也意味着您可以随意移动数据库服务器,而不会导致数据不一致,因为您使用的是应用程序设置的时间。

【讨论】:

  • 我将添加到上面,尽管客户端应用程序使用其系统日期 (getdate()) 从 Sybase 服务器读取数据,这将基于数据库主机本地时区设置而不是客户端应用程序时区。您可以使用 getutcdate() 获得跨时区的一致时间,因为这将始终返回 UTC 日期。如有疑问请检查
【解决方案2】:

我的理解是 Sysbase 从 1970 年 1 月 1 日 00:00 开始存储微秒。

  • SELECT\READ: 以主机的时区返回转换后的日期(以微秒为单位存储)。
  • INSERT\WRITE:根据主机时区的时区插入微秒值。

如果您移动数据库并更改主机时区,则返回给应用程序的日期将会更改(非常糟糕),至少是日期的字符串表示形式。

我的建议,让数据库和应用程序始终以 UTC 处理,在表示层进行转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多