我最近在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)
Eri*_*son 16
什么是时间戳?
timestamp数据类型定义为
varbinary(8) null
Run Code Online (Sandbox Code Playgroud)
它与时间或日期有任何关系吗?
不,名字选择不当.
我可以将其转换为日期时间吗?
没有.
如果不是时间或日期,你用它做什么?
每次插入或更新带有时间戳列的行时,时间戳列都会自动更新.请注意,实际上有两种时间戳. TIMESTAMP
和CURRENT TIMESTAMP
.区别在于CURRENT TIMESTAMP
仅在插入时设置.
Sybase 文档停在那里让我想知道为什么f*rainbow!*k任何人都会使用数据类型时间戳.令人高兴的是,我发现了一些其他的 讨论并推断出它在实现乐观并发控制时的用途.
并发控制是一种确保多个事务可以在同一时间/大约同时运行并且仍然可以生成正确数据的方法. 乐观并发控制是一种并发控制方法,它假定多个事务可以完成而不会相互干扰.即不需要锁定.维基百科描述了以下算法:
Sybase的timestamp数据类型可以在此算法的步骤1和3中使用,而不是使用日期/时间.但在我看来,它并不像使用datetime数据类型节省了很多工作.我想它可能表现得更好.
最近,有人问我是否可以将TIMESTAMP SYBASE IQ数据类型转换为DATE; 我总是避免这种数据类型,因为它是黑暗的.经过几个小时的阅读SYBASE文档并进行一些测试后,我得出以下结论:
TIMESTAMP:
这是将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.