为了完美,这里或多或少是一个。
Microsoft SQL Server仅包含用于存储日期和时间的字段类型datetime
。
但是,假设我想存储营业时间列表,其中日期完全无关紧要。目前我正在使用datetime
类型,然后只显示数据的时间部分。但我有两个问题。
所以它引出了一个问题;在没有特定time
字段的情况下(如在MySQL中),从00:00到23:59只存储一天中特定时间的最佳方式是什么?
UPDATE :这是SQL Server 2005.(另外,我只是想知道在没有time
类型的情况下一般该做什么。)
答案 0 :(得分:7)
对于SQL Server 2005或更早版本......
如果您只想了解某一分钟,可以将其存储为1-1440
范围内的int。 1
为00:01,1440
为0: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。
WHERE minutes < 720
之类的代码比WHERE time < '12:00'
也就是说,我使用INTEGER字段来保持秒数,例如当它们主要用于计算平均持续时间等时。
我在选择类型时最大的考虑因素是如何使用该值;确保清晰的代码和高性能的执行计划。
答案 4 :(得分:0)
SQL 2008解决了这个问题,正如其他人已经注意到的那样,但在2005年:
您需要在时间上执行任何日期数学吗?如果没有,您可以将其存储为字符串。
如果您需要执行日期数学运算,将日期设置为零的日期时间以及描述性列名称不应该阻止任何未来的开发人员(并且感谢您记住我们)。
是的,对于仅限时间的存储,datetime很笨,但功能很好。