【问题标题】:How do I get date/time information from a TIMESTAMP column?如何从 TIMESTAMP 列中获取日期/时间信息?
【发布时间】:2011-11-01 13:19:52
【问题描述】:

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

【问题讨论】:

    标签: sql-server sql-server-2008


    【解决方案1】:

    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。

    【讨论】:

    • 我相信这是 Sybase 的遗留问题 - (Microsoft) SQL Server 团队从未有机会解决此问题....
    • @marc_s 所以,Sybase SQL Server 团队,好的。 :-) 我只知道它早于我使用 SQL Server 的经验。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      根据使用场景和您需要的精度范围,您可以使用以下技术: 至于 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()),那么您可以将该表用作“时间标尺”。

      【讨论】:

      • 感谢安德烈的回答。不是我想要的,但这是一个有趣的想法。
      • 很好地利用 ROWVERSION 列的好方法。在跨表广泛使用 ROWVERSION 的数据库中看起来像一个守护者并且很有用。
      猜你喜欢
      • 2013-09-14
      • 1970-01-01
      • 1970-01-01
      • 2012-10-01
      • 2013-11-29
      • 1970-01-01
      • 1970-01-01
      • 2020-12-14
      • 2021-04-16
      相关资源
      最近更新 更多