【问题标题】:Storing "Time" in database- What to use DateTime/Interger/VarChar在数据库中存储“时间”- 使用什么 DateTime/Interger/VarChar
【发布时间】:2011-10-14 13:23:23
【问题描述】:

我想保存用户执行的各种活动的日期和时间。对于日期,我决定在数据库中使用 DateTime 列,而对于时间,我处于两难选择的数据类型中。

我知道在 sql server 2008 中引入了时间数据类型,但我使用的是旧版本,即 Sql Server 2005,所以 我需要你的建议来证明我的理解是真是假。

我见过有人使用 varchar 或 DateTime 将时间存储到数据库中。但我期待使用 Integer 数据类型。

我选择的原因是性能。

以下是我给自己的理由。

假设

任何保存到数据库中的数据都必须符合以下规则

日期将以 mm/dd/yyyy hh:MM:ss 格式存储,其中 hh:MM:ss 始终为 00:00:00 时间将以有效格式存储(从 hh:MM:ss 到 hhMMss)

if hh is 00 
  then MMss
and if MM is 00
  then ss
and if ss is 00 
  then 0

hh will range in between 0-23
MM will range in between 0-59
ss will range in between 0-59

i.e. few examples
00:00:00 = 0
00:01:00 = 100
01:00:00 = 10000
13:00:00 = 130000

个人认为为什么它会表现更好。

SELECT * FROM Log WHERE loginDate = '05/23/2011' 
AND loginTime BETWEEN 0 AND 235959 --Integer Comparison

当基于 DateTime 使用 JOINS 时,只考虑对 Date 部分进行连接。

在不考虑时间的情况下根据通用日期加入两个表。如果使用 DateTime 作为存储数据类型,我认为类型转换会在这种情况下产生重大影响。

由于 Sql 必须进行整数比较并且不需要进行类型转换,因此它应该表现更好。

编辑

我刚刚发现的一个缺点是,当我想得到 3 天之间花费了多少时间的两倍之间的差异时,希望它会成为在整个应用程序中管理的噩梦。

【问题讨论】:

  • 如果您需要同时存储时间和日期时间,为什么不存储时间?
  • @JeremySmyth:在某些地方我们需要跟踪开始时间和结束时间,而且我仍在寻找正确和更好的方法...请提出两者的优缺点
  • 当您将时间存储为 DateTime 的一部分时,您完全没有理由不能跟踪、计算和查询时间。只需使用现有字段。

标签: sql-server-2005 datetime


【解决方案1】:

那么为什么需要 2 列。如果 DateTime 列 (loginDate) 的时间为 00:00:00 为空,为什么不直接使用该空白空间作为 loginTime 并拥有一列。

WHERE loginDate >= '05/23/2011' AND loginDate < '05/24/2011'

如果您打算使用整数,那么它没有任何问题。

【讨论】:

  • ...或WHERE CONVERT(varchar(10), loginDate, 101) = '05/23/2011'
  • @JeremySmyth:如果我使用转换,则不会应用索引。
  • @LastCoder:在大多数地方,我们只会根据日期获取数据,而不考虑时间。即,无论时间如何,我们都需要覆盖一整天的数据……有时我们需要仅基于日期而不是时间在表上使用 JOINS……然后在那些地方我们必须进行类型转换。 .我认为这会减慢进程。
  • @ShantanuGupta 你错了。您已经在这些字段中存储时间,因此无论您看到什么“放慢速度”都已经存在。您存储了一个无意义的值并且从不使用它这一事实无关紧要。
【解决方案2】:

考虑到您的编辑,您理想的解决方案是将日期和时间放在同一列中,即DATETIME

  • 然后您可以使用 DATEDIFF 轻松计算开始时间和结束时间之间的差异
  • 您可以使用CONVERT(varchar(10), loginDate, 101) 轻松建立日期部分
  • 您可以使用CONVERT(varchar(10), loginDate, 108) 轻松建立时间部分

如果不要求精度 SMALLDATETIME 解决存储问题。 SMALLDATETIME 每列需要四个字节,这与INTEGER 相同,因此与使用两列相比,您获得了显着的净收益。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 2012-09-16
    相关资源
    最近更新 更多