回答神秘的Sybase ASE'timestamp'数据类型问题

RAY*_* HO 6 database sybase timestamp ase

Eric Johnson在2010年8月提出以下问题."Sybase中神秘的'timestamp'数据类型是什么?

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

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


回答问题1:'时间戳到底是什么?'

•Sybase ASE数据库的时间戳集中保存在该数据库的内部内存表"dbtable"中 - 此表是在数据库联机时构建的.您可以通过选择@@ dbts来查询当前的数据库时间戳 - 请注意,此varbinary(8)'数据库'时间戳值取决于平台,即受Big/Small字节序的影响.

•每个用户表可以有一个时间戳列,用于保存给定行的INSERT/UPDATE的"数据库"时间戳值.成功完成TSQL DML命令后,所有'Table'时间戳列值都由ASE自动维护(就像标识列一样).但是,与"数据库"时间戳不同,"表"时间戳值与平台无关,因为无论O/S平台的字节顺序如何,它们始终以Big-endian字节顺序保留(有关详细信息,请参阅下面的详细信息).


回答问题2:"它与时间或日期有任何关系吗?"

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


回答Q#3:'我可以将它转换为日期时间吗?'

不,您无法将其页面的"数据库"时间戳或"本地"时间戳转换为日期/时间值.


回答问题4:'如果不是时间或日期,你用它做什么?'

•每当修改或创建数据库中的页面时,"数据库"时间戳将加1,而受影响页面的"本地"时间戳(在其页眉中)随后与该时间点的"数据库"时间戳同步.

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

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


进一步的信息,警告和警告: -

(1)"数据库"和"本地"时间戳存储在3个部分中,并且与OS平台字节顺序相关.例如0xHHHH 0000 LLLLLLLL

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

(2)用户'Table'时间戳也存储在3个部分中,但始终处于Big-endian方向.例如0x0000 HHHH LLLLLLLL

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

(3)数据库时间戳保存在给定数据库的内存系统表dbtable中(在数据库联机时创建).

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

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