【发布时间】:2011-10-08 17:59:28
【问题描述】:
我有一个包含两列的表,第一列是 (currentdate)timestamp,另一列是 (dateReturn)datetime 列。我需要从天数中获取 currentdate 和 dateReturn 之间的差异。这可能吗?
【问题讨论】:
标签: sql sql-server
我有一个包含两列的表,第一列是 (currentdate)timestamp,另一列是 (dateReturn)datetime 列。我需要从天数中获取 currentdate 和 dateReturn 之间的差异。这可能吗?
【问题讨论】:
标签: sql sql-server
不,这是不可能的。
与流行的看法(以及名称本身)相反,timestamp 列实际上与时间无关。
免责声明:此答案特定于 Sql Server(根据问题的标签),其他数据库引擎可能在此处有不同的实现。*
相反,它是一个稳步增加的 64 位数字。该数字的值在具有此类时间戳列的单个数据库中的所有表之间共享。换句话说,如果你有两个这样的表,一个修改一行,另一个修改一行,第一个表中时间戳的值为X,第二个表中时间戳为X+1。
as per the documentation of timestamp:
每个数据库都有一个计数器,对于在数据库中包含时间戳列的表执行的每个插入或更新操作,该计数器都会递增。此计数器是数据库时间戳。这会跟踪数据库中的相对时间,而不是可以与时钟关联的实际时间。
因此,该值与插入或上次修改行的实际日期和/或时间无关,并且不能以任何方式转换为这样的日期/时间。
timestamp 列的唯一目的是拥有独特的东西,保证会增加。由于该值为 64 位,因此您将可以访问 18 446 744 073 709 551 616 操作,这些操作需要在值重置之前使用 timestamp 列。如果您有一个每秒可以处理一百万次此类操作的数据库,那么您仍然需要等待大约 584 554 年才能重置值,所以我会说它满足唯一性要求。
【讨论】:
currentdate 这个名字有点用词不当。如果该字段应该保存上次修改(或初始插入)的日期和时间,那么timestamp 是错误的数据类型,日期时间列和触发器或类似的更合适。
sql server 中的timestamp 数据类型不存储日期或时间。它更像是一个版本维护列,每次更新行时都会更新。所以你应该重新考虑这个列的数据类型
【讨论】:
如果你的专栏有(比较少见的)timestamp 类型,Lasse V. Karlsen 的回答是对的。
如果两列都具有datetime 类型,您可以:
select datediff(day, dateReturn, currentdate)
from YourTable
【讨论】: