PostgreSQL timestamp 資料型態的極大值

昨天有人遇到 PostgreSQL 超過 timestamp 資料型態的極大值然後噴錯誤的狀況,查了一下 PostgreSQL 手冊 Data Type 章節上的說明:

PostgreSQL 9.6.3 Documentation Chapter 8.5 Date/Time Types

覺得很好奇西元 294276 年這個極大值是怎麼算出來的,從文件上知道以下幾點:

  1. Microsecond (百萬分一秒)為單位。
  2. Storage Size 是 8 bytes(64 bits)。
  3. 時間原點是 2,000–1–1 00:00:00 UTC。
  4. 整數形式。

猜想該不會就只是從 2,000 AD 到 294,276 AD 間有多少個 Microsecond 這樣吧?

((294,276 - 1,999)*(365 + 0.25 - 0.01 + 0.0025) + 8)*86,400*1,000,000 = 9,223,371,950,904,000,000

而 Signed 的 64 bit 整數極大值是

2⁶³ - 1 = 9,223,372,036,854,775,807

兩者相減後差距不到一天

9,223,372,036,854,775,807 - 9,223,371,950,904,000,000 = 85950,775,807

極小值 4,713 BC 可能就得翻 PostgreSQL source code 看是怎麼訂出來的。