Sybase中神秘的'timestamp'数据类型是什么?

Eri*_*son 16 sql sybase

我最近在Sybase数据库中发现了一个使用"timestamp"类型列的表.如果我使用这个神秘的时间戳数据类型创建一个表

create table dropme (
    foo timestamp,  
    roo int null
)
insert into dropme (roo) values(123)
insert into dropme (roo) values(122)
insert into dropme (roo) values(121)
select * from dropme
go
Run Code Online (Sandbox Code Playgroud)

我从'select*from dropme'获得以下内容:

 foo                  roo
 -------------------- -----------
   0x000100000e1ce4ea         123
   0x000100000e1ce4ed         122
   0x000100000e1ce509         121
Run Code Online (Sandbox Code Playgroud)

0x000100000e1ce4ea对我来说看起来不是很时间.另外,我从'sp_help timestamp'看到了这个输出:

 Type_name Storage_type Length Prec Scale Nulls Default_name Rule_name Access_Rule_name Identity
 --------- ------------ ------ ---- ----- ----- ------------ --------- ---------------- ----------
 timestamp varbinary         8 NULL  NULL     1 NULL         NULL      NULL                   NULL
Run Code Online (Sandbox Code Playgroud)

我的问题如下

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

Eri*_*son 16

什么是时间戳?

timestamp数据类型定义为

varbinary(8) null
Run Code Online (Sandbox Code Playgroud)

它与时间或日期有任何关系吗?

不,名字选择不当.

我可以将其转换为日期时间吗?

没有.

如果不是时间或日期,你用它做什么?

每次插入或更新带有时间戳列的行时,时间戳列都会自动更新.请注意,实际上有两种时间戳. TIMESTAMPCURRENT TIMESTAMP.区别在于CURRENT TIMESTAMP仅在插入时设置.

Sybase 文档停在那里让我想知道为什么f*rainbow!*k任何人都会使用数据类型时间戳.令人高兴的是,我发现了一些其他的 讨论并推断出它在实现乐观并发控制时的用途.

并发控制是一种确保多个事务可以在同一时间/大约同时运行并且仍然可以生成正确数据的方法. 乐观并发控制是一种并发控制方法,它假定多个事务可以完成而不会相互干扰.即不需要锁定.维基百科描述了以下算法:

  1. 在交易开始时记录日期/时间标记
  2. 读取/更新数据
  3. 检查另一个事务是否修改了数据
  4. 提交或回滚

Sybase的timestamp数据类型可以在此算法的步骤1和3中使用,而不是使用日期/时间.但在我看来,它并不像使用datetime数据类型节省了很多工作.我想它可能表现得更好.

  • datetime的分辨率不是那么大,它相对容易获得插入,给出两行具有相同的日期时间 (2认同)
  • 维基是可悲的.时间戳是为乐观锁定而不是OCC而设计的,它存在于写维基的业余爱好者之前.上面给出的顺序是不正确的.另一个链接更好,但不解释OL.如果你打开一个新问题"什么是乐观锁定",我会回答. (2认同)

ArB*_*rBR 8

最近,有人问我是否可以将TIMESTAMP SYBASE IQ数据类型转换为DATE; 我总是避免这种数据类型,因为它是黑暗的.经过几个小时的阅读SYBASE文档并进行一些测试后,我得出以下结论:

TIMESTAMP:

  • 是12位数,存储为BINARY(这可能因环境而异)
  • 它表示自1970年1月1日以来的微秒值
  • Sybase不包含用于转换它们的直接函数
  • 每次插入记录时都会自动建立

这是将TIMESTAMP转换为DATE的SQL语句:

SELECT timestamp as TS, CONVERT(decimal, timestamp) as TS_IN_MS,
   CONVERT(date, dateadd(SS, CONVERT(int, SUBSTRING(CONVERT(varchar,                     
      CONVERT(decimal, timestamp)), 1, 9)), '1/1/1970'), 123)  as TS_AS_DATE  
   FROM TheTable
Run Code Online (Sandbox Code Playgroud)

可以使用如下的在线EPOCH转换器来证明转换:

注意:对于SYBASE ASE,TIMESTAMP类型不是有效的UNIX-EPOCH.

  • 你回答的很好,除了一件事:Sybase**ASE**的语句是假的.查看Unix Epoch(我的答案中的链接).在您的代码中,将Unix Epoch [1/1/1970](**秒**)添加到IQ TIMESTAMP,转换为秒.有用.在智商.好.Sybase ASE TIMESTAMP的时间为**毫秒**.如果您为ASE编写相同的SQL,请记住它,它将起作用.试试吧.语句*对于SYBASE ASE,TIMESTAMP类型不是有效的UNIX-EPOCH."*是**false**. (2认同)