【问题标题】:timestamp and datetime时间戳和日期时间
【发布时间】:2011-10-08 17:59:28
【问题描述】:

我有一个包含两列的表,第一列是 (currentdate)timestamp,另一列是 (dateReturn)datetime 列。我需要从天数中获取 currentdate 和 dateReturn 之间的差异。这可能吗?

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    不,这是不可能的。

    与流行的看法(以及名称本身)相反,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 年才能重置值,所以我会说它满足唯一性要求。

    【讨论】:

    • 大多数时候,时间戳列是指类型为“datetime”且名称为“timestamp”的列。 “timestmap”类型的列比较少见。
    • 在这种情况下,他特别说一列是日期时间,另一列是时间戳。
    • 换句话说,currentdate 这个名字有点用词不当。如果该字段应该保存上次修改(或初始插入)的日期和时间,那么timestamp 是错误的数据类型,日期时间列和触发器或类似的更合适。
    • 在 MySQL 中,时间戳确实存储了实际的日期时间。它以 UTC 格式存储日期时间。在 SQL 中,这是完全不同的事情,因为答案是 dev.mysql.com/doc/refman/5.0/en/timestamp.html
    • 然而标签上写着 sql-server。
    【解决方案2】:

    sql server 中的timestamp 数据类型不存储日期或时间。它更像是一个版本维护列,每次更新行时都会更新。所以你应该重新考虑这个列的数据类型

    【讨论】:

      【解决方案3】:

      如果你的专栏有(比较少见的)timestamp 类型,Lasse V. Karlsen 的回答是对的。

      如果两列都具有datetime 类型,您可以:

      select  datediff(day, dateReturn, currentdate)
      from    YourTable
      

      请参阅datediff function

      【讨论】:

        猜你喜欢
        • 2013-06-16
        • 2013-07-28
        • 1970-01-01
        • 1970-01-01
        • 2013-11-03
        • 2017-12-01
        • 1970-01-01
        • 2014-05-22
        • 2021-01-28
        相关资源
        最近更新 更多