6

Eric Johnson 在 2010 年 8 月提出了以下问题。“Sybase 中神秘的‘时间戳’数据类型是什么?

  1. 时间戳是什么鬼?
  2. 它与时间或日期有任何关系吗?
  3. 我可以将其转换为日期时间吗?
  4. 如果不是时间或日期,你用它做什么?”

我试图回答上述帖子,但由于原始帖子的年龄,本网站不接受新的回答。由于该主题仍然是 SAP/Sybase ASE 专业人士的常见问题,我决定重新发布上面的原始问题,并希望在下面给出一些明确的答案。


对 Q#1 的回答:“时间戳到底是什么?”

• Sybase ASE 数据库的时间戳集中保存在该数据库的内部内存表“dbtable”中——该表是在数据库联机时构建的。您可以通过选择@@dbts 查询当前的数据库时间戳——请注意,这个 varbinary(8) 'Database' 时间戳值取决于平台,即受大字节序和小字节序的影响。

• 每个用户表可能有一个时间戳列,用于保存给定行的插入/更新的“数据库”时间戳值。在成功完成 TSQL DML 命令时,所有“表”时间戳列值都由 ASE(就像标识列一样)自动维护。但是,与“数据库”时间戳不同,“表”时间戳值与平台无关,因为它们始终以大端字节顺序保存,而与 O/S 平台的字节序无关(有关详细信息,请参阅下面的更多信息)。


对 Q#2 的回答:“它与时间或日期有任何关系吗?”

不,“数据库”时间戳和页面“本地”时间戳中的值不反映实际日期/时间。


对 Q#3 的回答:“我可以将其转换为日期时间吗?”

不,您不能将其页面的“数据库”时间戳或“本地”时间戳转换为日期/时间值。


对 Q#4 的回答:“如果它不是时间或日期,你用它做什么?”

• 每当修改或创建数据库中的页面时,“数据库”时间戳加一,而受影响页面的“本地”时间戳(在其页面标题内)随后与该时间点的“数据库”时间戳同步。

• 与当前的“数据库”时间戳相比,数据库页面的“本地”时间戳反映了该页面上次更新或首次创建的相对年龄。因此,ASE 可以告诉数据库中所有页面的更新/创建的时间顺序。

• 应用程序可以以与标识列类似的方式使用“表”时间戳列来查找最近或最近插入/更新的行,而不管行的键值如何。


更多信息、警告和注意事项:-

(1) “数据库”和“本地”时间戳存储在 3 个部分中,并且取决于操作系统平台字节序。例如 0xHHHH 0000 LLLLLLLL

  • 2 字节高位 - 0xHHHH
  • 2 字节填充符 - 0x0000
  • 4 字节低位 - 0xLLLLLLLL

(2) 用户“表”时间戳也存储在 3 个部分中,但始终是大端方向。例如 0x0000 HHHH LLLLLLLL

  • 2 字节填充符 - 0x0000
  • 2 字节高位 - 0xHHHH
  • 4 字节低位 - 0xLLLLLLLL

(3) 数据库时间戳保存在给定数据库的内存系统表 dbtable 中(该数据库在数据库上线时创建)。

  • 注意 1 -“表”时间戳列值与数据库表的数据和/或索引页中的其他列值一样保存,其中定义了时间戳列。
  • 注意 2 - 请注意,通过 SELECT @@dbts 查询当前数据库的“数据库”时间戳会返回其十六进制表示形式,该表示形式受操作系统平台的字节序影响。
  • 注意 3 - 相反,通过 DBCC dbtable(不推荐)查询“数据库”时间戳会返回其 Big-endian 十六进制表示,因此,它与平台无关。
  • 警告 - 当给定数据库的“数据库”时间戳接近其最大限制时,即(0xFFFF,0xFFFFFFFF),根据数据库中插入/更新操作的频率,可能需要十年或更长时间才能达到该点,ASE 将发出警告,并且无法进行进一步的插入/更新 - 唯一的选择是使用 BCP(加上通过 sp_showtext 的存储过程)从所有对象中导出数据,删除数据库,再次创建它(使用新的 near-zer 'Database'时间戳)并导入数据(和存储过程)。

仅供参考 - 以上答案、提示和技巧是真实和准确的,因为我在 Sybase 工作,现在在拥有 ASE 产品的 SAP 工作。

4

0 回答 0