【发布时间】:2011-11-01 13:19:52
【问题描述】:
似乎TIMESTAMP 信息以某种方式加密,其中日期/时间数据以某种方式以二进制编码。我只想发现今天修改的所有行。
【问题讨论】:
标签: sql-server sql-server-2008
似乎TIMESTAMP 信息以某种方式加密,其中日期/时间数据以某种方式以二进制编码。我只想发现今天修改的所有行。
【问题讨论】:
标签: sql-server sql-server-2008
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;
然后create a TRIGGER 触发UPDATE 以保持ModifiedDate 值最新。您可能需要在初始化时决定是否希望 ModifiedDate 为 NULL 或等于 CreatedDate。
【讨论】:
TIMESTAMP 只是一个增量的每行值。它不包含任何实际的日期/时间信息。
您需要的是例如一个实际的 DATETIME 列,其默认值设置为 GETUTCDATE() 或类似的值。
【讨论】:
根据使用场景和您需要的精度范围,您可以使用以下技术: 至于 TIMESTAMP 类似于全局计数器,您可以添加一个具有 2 列的全局表:
日期时间、时间戳
并每隔 N 分钟在其中插入一些 JOB 值(取决于所需的精度)。作业将 NOW() 插入日期时间列和当前 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()),那么您可以将该表用作“时间标尺”。
【讨论】: