SQL Server中timestamp(时间戳)

SQL Server timestamp 数据类型与时间和日期无关。SQL Server timestamp 是二进制数字,它表明数据库中数据修改发生的相对顺序。实现 timestamp 数据类型最初是为了支持 SQL Server 恢复算法。每次修改页时,都会使用当前的 @@DBTS 值对其做一次标记,然后 @@DBTS 加1。这样做足以帮助恢复过程确定页修改的相对次序,但是 timestamp 值与时间没有任何关系。

@@DBTS 返回当前数据库最后使用的时间戳值。插入或更新包含 timestamp 列的行时,将产生一个新的时间戳值。

select @@DBTS 

适用场景:

通过timestamp字段查询变更数据,假如上次保存的时间戳的值是:0x0000000000163E30,那么我们通过下面的SQL脚本就能获取到这个时间戳之后变更的记录,获取到这里数据就可以更新内存数据了

注意事项:

1. 每个数据库都有一个计数器,当对数据库中包含 timestamp 列的表执行插入或更新操作时,该计数器值就会增加。 该计数器是数据库时间戳;

2. 一个表只能有一个 timestamp 列;

3. 注意删除数据操作是没有办法记录时间戳的,所以你删除记录的逻辑应该是用一个字段标识这行记录已经被删除;

4. 这一属性使 timestamp 列不适合作为键使用,尤其是不能作为主键使用;

5. 如果该列属于索引键,则对数据行的所有更新还将导致索引更新;

6. 若要返回数据库的当前时间戳值:SELECT @@DBTS

7. 在 DDL 语句,请尽量使用 rowversion 而不是 timestamp,在SSMS设计表的时候是没有rowversion数据类型的;

8. 在 CREATE TABLE 或 ALTER TABLE 语句中,不必为 timestamp 数据类型指定列名,如果不指定列名,则 Microsoft SQL Server 数据库引擎将生成 timestamp 列名;但 rowversion 同义词不具有这样的行为。 在使用 rowversion 时,必须指定列名。

9. 不可为空的 rowversion 列在语义上等同于 binary(8) 列。 可为空的 rowversion 列在语义上等同于 varbinary(8) 列。

### 如何在 SQL Server 中生成时间戳 #### 使用 `DATEDIFF` 函数生成 Unix 时间戳(秒级) 为了获取当前日期的时间戳,可以使用 `DATEDIFF` 函数计算自 1970 年 1 月 1 日以来经过的秒数: ```sql SELECT DATEDIFF(s, '1970-01-01 00:00:00', GETDATE()) AS TimestampInSeconds; ``` 对于特定日期的时间戳,同样可以通过指定目标日期来实现: ```sql SELECT DATEDIFF(s, '1970-01-01 00:00:00', '2024-03-16') AS SpecificTimestampInSeconds;[^1] ``` #### 将时间戳转换回日期 如果拥有一个 Unix 时间戳并希望将其转换成可读的日期格式,则可以利用 `DATEADD` 函数完成此操作: ```sql SELECT DATEADD(SECOND, 1528380035, '1970-01-01 00:00:00') AS DateFromTimestamp; ``` 这里假设输入的是一个标准的 Unix 时间戳值。 #### 处理毫秒级别精度的时间戳 当需要更高精度——即包含毫秒级别的 Unix 时间戳时,可以采用如下方法构建 13 位长度的时间戳: ```sql SELECT CONVERT(BIGINT, DATEDIFF(MINUTE, '1970-01-01 00:00:00.000', GETUTCDATE())) * 60000 + DATEPART(SECOND, GETUTCDATE()) * 1000 + DATEPART(MILLISECOND, GETUTCDATE()) AS MillisecondTimestamp; ``` 这段查询语句首先基于分钟差异进行换算再累加剩余部分以达到精确到毫秒的效果。[^4] #### 关于 `ROWVERSION` 和过期的 `TIMESTAMP` 类型 值得注意的是,在创建表结构或其他数据库对象时应优先考虑使用 `ROWVERSION` 数据类型而非已废弃的 `TIMESTAMP` 类型。这是因为后者并不遵循 ISO 标准,并且可能在未来版本中被完全移除。因此推荐按照官方指导选用更合适的替代方案。[^2][^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫叶思念

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值