Java

Sybase 如何儲存日期時間資訊?

  • March 6, 2017

我們有一個 Sybase 數據庫,該數據庫目前將日期時間值儲存在某些表中。如果我們將帶有 Sybase 數據庫的伺服器移動到另一個時區的另一個國家,數據庫中的日期時間值會以不同的方式表示嗎?

換句話說,考慮以下場景:

Sybase 數據庫在時區 +2:00 中執行。

從我位於 +1:00 時區的 Java 應用程序中,它會在 1970 年 1 月 1 日 1:00 寫入數據庫,這是應用程序時區的 0 紀元。

preparedStatement.setTimestamp(3, new Timestamp(0));

但是,當我使用 SQL Workbench/J 客戶端(時區 +1:00)查詢數據庫時,我看到

1970-01-01 01:00:00

在我的桌子上。事實上,我將電腦時鐘更改到哪個時區並不重要,SQL Workbench/J 客戶端總是1970-01-01 01:00:00從數據庫中讀取。

另一個位於 +3:00 時區的 Java 客戶端讀取的值與

1970-01-01 01:00:00

轉換為紀元-7200000-2:00客戶的時區!

所以回到我最初的問題,Sybase 是否將日期時間值儲存為字元串或紀元?我沒有可以試驗的免費 Sybase 伺服器,那麼當我們將伺服器移動到具有不同時區的另一個國家時會發生什麼?

我們使用的類型是“datetime”,例如:

CREATE TABLE "dbo"."whatever" (eventDate datetime NOT NULL);

下面的答案取自http://www.sybase.com/detail?id=1048699上的 Sybase 官方技術文件(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數據庫欄位中的數據產生任何明顯影響。

引用自:https://dba.stackexchange.com/questions/69715