【问题标题】:Store Quarter/Year in SQL Server在 SQL Server 中存储季度/年
【发布时间】:2021-04-19 14:19:26
【问题描述】:

我有一个需要存储季度和年份的表,我需要知道哪种方法最好。我在 10 年前找到了这个答案:Best way to store quarter and year in SQL Server。但是,给出了两个建议 - 一个是将季度和年份存储在单独的列中并将它们设为整数,另一个是存储为日期时间并使用该月的第一天作为当天(即 2021 年 1 月 1 日, 2021 年 4 月 1 日等)。

考虑到这个答案已有 10 年历史,现在可能有更好的方法来存储这些数据,最好的方法是什么?

仅供参考,此数据不会用于计算目的,但可能会被搜索。

谢谢!

【问题讨论】:

  • 并没有太大的区别,但 date 而不是 datetime。尽管使用两列查询更复杂,但可能更容易理解。无论您做什么,都不要将它们存储在 varchar 中,也不要将它们作为 int 202101 存储在一个字段中。
  • 这很大程度上取决于您的查询。根据需要,这两种方法都可以更好或更差。出于存储目的,这几乎没有问题,因为 DATESMALLINT + TINYINT 组合都占用 3 个字节。出于索引和计算的目的,可能会有很大的不同。就数据完整性而言,仅存储合法的数据(即实际季度,而不是任意日期)可能是另一个问题。自最初的问题以来已经过去的 10 年在这些问题上并没有真正产生任何影响。计算列可以弥补差异。

标签: sql sql-server database


【解决方案1】:

我建议始终将与日期相关的数据存储为日期时间数据类型。

将它们分开存储是最糟糕的方法,搜索变得非常困难。当您的年份和季度分开时,尝试编写返回 3Q2019 和 1Q2021 之间所有季度的查询。

将其分解为单独的部分使开发人员有责任适当地处理年份边界,而许多人没有这样做。

DateTime 数据类型还包括验证(2020 年第 5 季度会引发错误)以防止数据错误。

为工作使用正确的工具。 DateTime 数据应始终存储在 DateTime 数据类型中。

【讨论】:

  • 感谢 Charlieface、Jeroen 和 Wes 的 cmets。我猜这是另一个会有很多不同意见的话题,我认为所有这些话题都有优点。韦斯,你的解释很有道理。我想我最终会使用 DATE。然后,编写界面代码的开发人员可以按照客户的意愿使列显示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-20
  • 2013-12-02
  • 2019-03-08
  • 1970-01-01
  • 1970-01-01
  • 2020-04-28
  • 2020-07-23
相关资源
最近更新 更多