Jas*_*iti 4 sybase jdbc java timezone datetime
我们有一个 Sybase 数据库,当前在某些表中存储日期时间值。如果我们将装有 Sybase 数据库的服务器移动到位于另一个时区的另一个国家/地区,数据库中的日期时间值是否会以不同的方式表示?
换句话说,请考虑以下场景:
Sybase 数据库在时区 +2:00 运行。
从我位于时区 +1:00 的 Java 应用程序中,它将 1970 年 1 月 1 日 1:00 写入数据库,这是应用程序时区中的纪元 0。
preparedStatement.setTimestamp(3, new Timestamp(0));
Run Code Online (Sandbox Code Playgroud)
但是,当我使用 SQL Workbench/J 客户端(时区 +1:00)查询数据库时,我看到
1970-01-01 01:00:00
Run Code Online (Sandbox Code Playgroud)
在我的桌子上。事实上,无论我将计算机时钟更改为哪个时区,SQL Workbench/J 客户端始终1970-01-01 01:00:00
从数据库中读取数据。
位于时区 +3:00 的另一个 Java 客户端读取的值与
1970-01-01 01:00:00
Run Code Online (Sandbox Code Playgroud)
翻译为纪元-7200000
或-2:00
客户的时区!
那么回到我原来的问题,Sybase 是否将日期时间值存储为字符串或纪元?我没有可以进行实验的免费 Sybase 服务器,那么当我们将服务器移动到另一个时区不同的国家/地区时,我们会发生什么情况呢?
我们使用的类型是“datetime”,例如:
CREATE TABLE "dbo"."whatever" (eventDate datetime NOT NULL);
Run Code Online (Sandbox Code Playgroud)
下面的答案取自 Sybase 官方技术文档,网址为http://www.sybase.com/detail?id=1048699(SAP已删除对 sybase.com 上许多链接的支持;但是 The Way Back Machine 似乎有一个副本页面的内容,即使它有点旧)。
Sybase 服务器支持通过 datetime 和smalldatetime 数据类型(以及较新的服务器,日期和时间数据类型)以及 getdate()、dateadd()、datediff() 和 datepart() 使用日期和时间数据功能。getutcdate() 函数也被添加到一些服务器中,以提供协调世界时中的当前日期时间值,而不管服务器运行在哪个时区。
然而,datetime 和smalldatetime 数据类型不存储时区信息,并且产品完全不了解时区和夏令时的概念。Sybase 服务器仅识别和存储操作系统提供的值的日期和时间部分,这些值基于在操作系统级别配置的时区(通常通过 Unix 中的 TZ 环境变量设置或Windows 控制面板)适用于启动该产品的用户。dateadd 和 datediff 函数背后的计算知道闰年(使用每 4 年一次的规则,每 100 年除外,每 400 年除外),但不包括对闰秒或夏令时转换的任何调整到正常时间。
因此,我希望更改底层操作系统时区不会对datetime
数据库字段中存储的数据产生任何明显影响。
归档时间: |
|
查看次数: |
5455 次 |
最近记录: |