Sql server 2005 储存;时间“;在数据库中-如何使用DateTime/integer/VarChar

Sql server 2005 储存;时间“;在数据库中-如何使用DateTime/integer/VarChar,sql-server-2005,datetime,Sql Server 2005,Datetime,我想保存用户执行的各种活动的日期和时间。对于date,我已经决定在数据库中使用DateTime列,而对于Time,我则进退两难地选择了什么样的数据类型 我知道在sql server 2008中引入了时间数据类型,但我使用的是较旧的版本,即sql server 2005,因此我需要您的建议来证明我的理解正确或错误 我见过有人使用varchar或DateTime将时间存储到数据库中。但我希望使用整数数据类型 我选择的原因是性能 以下是我给自己的理由 假设 保存到数据库中的任何数据必须符合以下规则 日

我想保存用户执行的各种活动的日期和时间。对于date,我已经决定在数据库中使用DateTime列,而对于Time,我则进退两难地选择了什么样的数据类型

我知道在sql server 2008中引入了时间数据类型,但我使用的是较旧的版本,即sql server 2005,因此我需要您的建议来证明我的理解正确或错误

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

我选择的原因是性能

以下是我给自己的理由

假设

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

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

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

SELECT * FROM Log WHERE loginDate = '05/23/2011' 
AND loginTime BETWEEN 0 AND 235959 --Integer Comparison
在基于日期时间使用联接时,仅考虑日期部分的联接

在公共日期的基础上连接两个表,而不考虑时间。我认为在这种情况下,如果使用DateTime作为存储数据类型,类型转换将产生重大影响

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

编辑


我刚刚指出的一个缺点是,当我想要得到两次之间的差异,即3天之间花费了多少时间时,希望这将成为整个应用程序管理的噩梦。

那么为什么需要两列呢。如果DateTime列(loginDate)的时间为空00:00:00,为什么不将该空空间用于loginTime并设置一列呢

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

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

记住您的编辑,理想的解决方案是将日期和时间放在同一列中,即日期时间:

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

如果不需要<1分钟的精度,可以使用
SMALLDATETIME
解决存储问题
SMALLDATETIME
每列需要四个字节,这与
INTEGER
相同,因此使用两列可以获得显著的净收益。

如果需要同时存储时间和日期时间,为什么不将时间存储在datetime中?@JeremySmyth:在某些地方,我们需要跟踪开始时间和结束时间,此外,我仍在寻找正确和更好的方法……请建议两者的利弊。当您将时间存储为DateTime的一部分时,没有任何理由您不能跟踪、计算和查询时间。只需使用现有字段….或
其中CONVERT(varchar(10),loginDate,101)='05/23/2011'
@JeremySmyth:如果我使用转换,则不会应用索引。@LastCoder:在大多数地方,我们只会根据日期获取数据,而不考虑时间。i、 e.我们需要覆盖一整天的数据,而不考虑时间……有时我们需要在表上使用仅基于日期而不是基于时间的联接……然后在这些地方我们必须进行类型转换……我认为这会减慢过程。@ShantanuGupta您是错误的。您已经在这些字段中存储了时间,因此您将看到的任何“减速”都已经存在。事实上,您存储的是一个无意义的值,而从不使用它是无关紧要的。
WHERE loginDate >= '05/23/2011' AND loginDate < '05/24/2011'