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

时间:2011-08-22 23:23:55

标签: sql-server sql-server-2008

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

3 个答案:

答案 0 :(得分:32)

TIMESTAMP是SQL Server团队提供数据类型的不幸名称。这是为了并发,与日期或时间无关 - 他们建议使用别名ROWVERSION来防止混淆。从this Books Online article“在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;

然后在UPDATE上触发create a TRIGGER以使ModifiedDate值保持最新。您可能需要决定在初始化时是否希望ModifiedDate为NULL或等于CreatedDate。

答案 1 :(得分:14)

TIMESTAMP只是一个增量的每行值。它没有任何实际的日期/时间信息。

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

答案 2 :(得分: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

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

如果你没有可能创建这样的表/作业,你可以查看数据库并确定带有时间戳的其他表,也许你会很幸运,也会在那里找到datetime列(填写NOW()),然后就可以了将该表用作“时间标尺”。