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

时间:2013-09-02 13:30:03

标签: database timestamp sybase ase

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

  1. 什么是时间戳?
  2. 它与时间或日期有任何关系吗?
  3. 我可以将其转换为日期时间吗?
  4. 如果不是时间或日期,你用它做什么?“
  5. 我试图回答上述帖子,但由于原帖的年龄,本网站不会接受新答案。由于主题仍然是SAP / Sybase ASE专业人员的常见问题解答,因此我决定重新发布上述原始问题,并希望在下面给出一些明确的答案。


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

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

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


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

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


    回答问题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的存储过程),删除数据库,再次创建它(使用新的近zer '数据库'时间戳)并导入数据(和存储过程)。

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

0 个答案:

没有答案