如何从TIMESTAMP列获取日期/时间信息?

Aar*_*and 13 sql-server sql-server-2008

似乎TIMESTAMP信息以某种方式加密,其中日期/时间数据以某种方式以二进制编码.我只是想发现今天修改过的所有行.

Aar*_*and 32

TIMESTAMP是SQL Server团队提供数据类型的一个不幸的名称.这是为了并发,与日期或时间无关 - 他们建议使用别名,ROWVERSION以防止混淆.从这个联机丛书文章,"在DDL语句,使用rowversion而不是时间戳尽可能."

遗憾的是,您将无法从ROWVERSION已有的列中获取任何日期/时间详细信息,但如果此信息很重要,则应添加CreatedDate/ModifiedDate列,例如:

ALTER TABLE dbo.foo ADD CreatedDate DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
ALTER TABLE dbo.foo ADD ModifiedDate DATETIME NULL;
Run Code Online (Sandbox Code Playgroud)

然后创建一个TRIGGER触发,UPDATE以使ModifiedDate值保持最新.您可能需要确定NULL在初始化时是否希望ModifiedDate 等于或等于CreatedDate.


kpr*_*bst 14

TIMESTAMP只是一个增量的每行值.它不包含任何实际日期/时间信息.

你需要的是例如一个实际的DATETIME列,其默认值设置为GETUTCDATE()或类似的值.


And*_*ich 9

根据您的使用场景和您需要的精度范围,您可以使用以下技术:就TIMESTAMP类似全局计数器而言,您可以添加一个包含2列的全局表:

日期时间,时间戳

并且每N分钟在那里制作一些JOB插入值(取决于所需的精度).Job将NOW()插入datetime列和当前TIMESTAMP值.通过这种方式,您可以获得某种"时间标尺",并且您始终可以确定来自另一个表的特定TIMESTAMP属于哪个时间跨度.示例:您有时间戳值0x000121并在生成时查找时间跨度.你的桌子有价值

20120501 12:00:00   0x000001
20120501 12:15:00   0x000061
20120501 12:30:00   0x000091
20120501 12:45:00   0x000151
Run Code Online (Sandbox Code Playgroud)

使用select查询,您将能够确定0x000121介于20120501 12:30:00和20120501 12:45:00之间

如果你有没有可能创造这样的表/工作,你可以看看到数据库,并确定与时间戳其他表,也许你会很幸运,并会在那里找到datetime列以及(充满NOW()),那么你可以使用该表作为"时间统治者".

  • 如何充分利用ROWVERSION专栏是一种非常有趣的方式.看起来像一个守护者,并且可以在跨表广泛使用ROWVERSION的数据库中使用. (2认同)