在数据库中存储“时间” - 使用什么DateTime / Integer / VarChar

时间:2011-10-14 13:23:23

标签: sql-server-2005 datetime

我想在执行的各种活动中保存用户的日期和时间。到目前为止,我已经决定在数据库中使用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 as 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天之间花费了多少时间之间的差异时,希望这将成为整个应用程序中管理的噩梦。

2 个答案:

答案 0 :(得分:1)

那你为什么需要2列呢?如果DateTime列(loginDate)的空时间为00:00:00,为什么不将该空白空间用于loginTime并且只有一列。

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

如果您打算使用整数,那么它就没有错。

答案 1 :(得分:1)

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

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

使用SMALLDATETIME可能会解决存储问题,如果精度&lt;不需要1分钟。 SMALLDATETIME每列需要四个字节,与INTEGER相同,因此您使用两列时获得了显着的净增益。