【问题标题】:Splitting time and date in two separate date columns, in SQL server, is best practice?在 SQL Server 中,将时间和日期拆分为两个单独的日期列是最佳做法吗?
【发布时间】:2010-12-17 18:43:54
【问题描述】:

将 dateTime 拆分为两个 datetime SQL 列是最佳做法吗?

例如,2010-12-17 01:55:00.000 放在两列中,

  • 一列包含一个日期时间 日期部分:2010-12-17 00:00:00.000
  • 一列包含日期时间 时间部分:1900-01-01 01:55:00.000

有人告诉我这是最佳做法,因为在某些时候 SQL 2000 不允许在日期中输入时间?甚至还有数据存储标准强制执行此操作,并且某些公司已确保以这种方式存储其所有数据以符合某些数据存储标准?

如果是这样的话,我敢肯定有人在这里听说过,这听起来很熟悉吗?

【问题讨论】:

  • 曾有一段时间,2 位数字也被认为是多年的最佳做法。
  • @Anthony - 现在它被认为是最佳实践还是只是常见实践? :)

标签: sql sql-server database database-design


【解决方案1】:

在 sql server 2008 中,您有日期和时间数据类型,因此这不是问题。即使在 sql server 6 和 7 中,datetime 也总是允许时间

人们将其拆分的原因是,对于 1 列中的所有内容,返回在任何一天下午 3 点到 4 点之间下达的所有订单的查询需要扫描,对于时间列,这可以通过查找来完成(很多很多更快)

【讨论】:

  • 我不知道的扫描与搜索,在我的情况下,我想重构一个当前具有每个日期时间类型的表。我想把它们放在一个日期时间里。或者按照这里的建议,日期类型中的日期和时间类型中的时间。该应用程序用于时间管理,日期和时间是应用程序的核心。
【解决方案2】:

从 SQL 2005 开始,我只会做一列。

如果您希望此信息是 Sargable,我会改用 computed columns。通过这种方式,您可以查询日期或时间或两者,并且您的应用程序代码仅负责维护一列。

【讨论】:

    【解决方案3】:

    我知道这已经过时了,但您可能希望保持独立的另一个原因是用户输入(并且 GenEric 在评论中说这是为了时间管理)。如果您允许用户将日期/时间作为单独的字段输入,并且您希望能够在任一字段为空的情况下保存数据,那么在您的数据库中有 2 个单独的可空字段非常好。否则我猜你要么不得不求助于某些日期值等于“空”的组合,或者添加额外的位字段作为“无时间/无日期”标志。

    【讨论】:

    • 我很难想到用户输入没有日期上下文的时间值的场景。根据我的经验,这通常是假设日期是今天的简写,在这种情况下,应用程序将持续 + 。你能提供一个你只需要时间而不是日期的例子吗?
    猜你喜欢
    • 2018-08-28
    • 2018-01-14
    • 1970-01-01
    • 2021-10-10
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多