如何从TIMESTAMP列获取date/时间信息?
似乎TIMESTAMP
信息是以某种方式encryption的,其中date/时间数据以某种方式用二进制编码。 我只想发现今天修改的所有行。
TIMESTAMP
是SQL Server团队给出数据types的一个不幸的名字。 它是为了并发,并且与date或时间无关 – 他们推荐使用它的别名ROWVERSION
来防止混淆。 从这本联机丛书文章 , “在DDL语句中,尽可能使用rowversion而不是时间戳”。
不幸的是,您将无法从ROWVERSION
列中获取任何date/时间详细信息,但如果此信息非常重要,则应添加CreatedDate / ModifiedDate列,例如:
ALTER TABLE dbo.foo ADD CreatedDate DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP; ALTER TABLE dbo.foo ADD ModifiedDate DATETIME NULL;
然后在UPDATE
上创build一个TRIGGER
来触发ModifiedDate值。 您可能需要决定是否要在初始化时将ModifiedDate设为NULL
或等于CreatedDate。
TIMESTAMP只是一个增量的每行值。 它不包含任何实际的date/时间信息。
你需要的是例如一个实际的DATETIME列,其默认值设置为GETUTCDATE()
或类似的东西。
根据使用场景和你需要的精度的比例,你可以使用以下技术:就TIMESTAMP类似于全局计数器而言,你可以添加一个包含2列的全局表:
date时间,时间戳
并每隔N分钟做一些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
使用select查询,您将能够确定,0x000121介于20120501 12:30:00和20120501 12:45:00之间
如果你不可能创build这样的表/作业,你可以查看数据库,并确定其他表与时间戳,也许你会很幸运,并会在那里finddate时间列(填充NOW()),那么你可以使用该表作为“时间标尺”。