SQL Server:最佳的存储时间方式(无日期)

时间:2011-08-03 14:07:43

标签: sql sql-server

为了完美,这里或多或少是一个。

Microsoft SQL Server仅包含用于存储日期和时间的字段类型datetime

但是,假设我想存储营业时间列表,其中日期完全无关紧要。目前我正在使用datetime类型,然后只显示数据的时间部分。但我有两个问题。

  1. 看起来效率低下。
  2. 可能会让未来的开发者感到困惑,因为他们可能不知道是否在任何地方使用了这个时间,因此他们可能不知道是否在任何地方使用这些日期。
  3. 所以它引出了一个问题;在没有特定time字段的情况下(如在MySQL中),从00:00到23:59只存储一天中特定时间的最佳方式是什么?

    UPDATE :这是SQL Server 2005.(另外,我只是想知道在没有time类型的情况下一般该做什么。)

5 个答案:

答案 0 :(得分:7)

对于SQL Server 2005或更早版本......

如果您只想了解某一分钟,可以将其存储为1-1440范围内的int。 1为00:01,14400:00

如果您愿意,可以轻松再次显示:

SELECT CAST((605 / 60) as varchar) + ':' + RIGHT('0' + CAST((605 % 60) as varchar), 2)

这样做的另一个好处是,如果使用smallint数据类型,则每个记录可以从内置TIME数据类型中保存1-3个字节。

TIME每行使用3-5个字节,smallint每行使用2个字节。

我认为额外的字节是秒和小数秒。

修改

秒数更复杂但我仍然可以考虑......

1-86400范围(每天秒数)

DECLARE @i INT
SET @i = 3661

SELECT RIGHT('0' + CAST((@i / 3600) as varchar),2) --hours
+ ':' + RIGHT('0' + CAST((@i % 3600)/60 as varchar), 2) -- minutes
+ ':' + RIGHT('0' + CAST((@i % 3600)%60 as varchar), 2) -- seconds

答案 1 :(得分:5)

SQL Server 2008具有TIME数据类型:

http://www.sql-server-performance.com/2007/datetime-2008/

DECLARE @dt as TIME
SET @dt = getdate()
PRINT @dt

升级到SQL 2008?

答案 2 :(得分:2)

答案 3 :(得分:2)

就个人而言,我不会认为所提出的观点足以让我们不再使用DATETIME或SMALLDATETIME。

  • INT使用4个字节,SMALLDATETIME
  • 也是如此
  • 人们使用SMALLINT犯错导致隐式类型转换(增加cpu负载)
  • 磁盘空间很便宜,你需要很多字节才能添加到任何重要的
  • WHERE minutes < 720之类的代码比WHERE time < '12:00'
  • 更难理解
  • 显示问题(例如将DATETIME转换为hh:mm)通常是客户端的最佳位置
  • 使用DATETIME可以实现未来的灵活性,例如移动到秒而不是分钟

也就是说,我使用INTEGER字段来保持秒数,例如当它们主要用于计算平均持续时间等时。

我在选择类型时最大的考虑因素是如何使用该值;确保清晰的代码和高性能的执行计划。

答案 4 :(得分:0)

SQL 2008解决了这个问题,正如其他人已经注意到的那样,但在2005年:

您需要在时间上执行任何日期数学吗?如果没有,您可以将其存储为字符串。

如果您需要执行日期数学运算,将日期设置为零的日期时间以及描述性列名称不应该阻止任何未来的开发人员(并且感谢您记住我们)。

是的,对于仅限时间的存储,datetime很笨,但功能很好。