SQL Server:存储时间的最佳方式(无日期)
为了完美起见,这里多多少少有一个 Microsoft SQL Server仅包含用于存储日期和时间的字段类型SQL Server:存储时间的最佳方式(无日期),sql,sql-server,Sql,Sql Server,为了完美起见,这里多多少少有一个 Microsoft SQL Server仅包含用于存储日期和时间的字段类型datetime 但假设我想存储一个营业时间列表,其中日期完全不相关。目前我使用的是datetime类型,然后只显示数据的时间部分。但我有两个问题 这似乎效率低下得令人尴尬 它可能会让未来的开发人员感到困惑,因为他们可能不知道是否在任何地方使用了完整的日期和时间 因此它回避了这个问题;如果没有特定的时间字段(如MySQL),那么仅存储一天中特定时间(从00:00到23:59)的最佳方式是什
datetime
但假设我想存储一个营业时间列表,其中日期完全不相关。目前我使用的是datetime
类型,然后只显示数据的时间部分。但我有两个问题
时间
字段(如MySQL),那么仅存储一天中特定时间(从00:00到23:59)的最佳方式是什么
更新:这是SQL Server 2005。(另外,我只想知道在没有
时间
类型的情况下通常应该做什么。)SQL Server 2008有一个时间
数据类型:
升级到SQL 2008?适用于SQL Server 2005或更早版本… 如果您只想知道一分钟,可以将其存储为
1-1440
范围内的int<代码>1是00:01,1440
是0:00
如果您愿意,很容易再次显示为时间:
选择CAST((605/60)作为varchar)+':'+右('0'+CAST((605%60)作为varchar),2)
这样做的另一个好处是,如果使用smallint
数据类型,则可以从内置的TIME
数据类型中为每条记录节省1-3个字节
TIME
每行使用3-5个字节,smallint
每行使用2个字节
我相信额外的字节是秒和分数秒
编辑
这是更复杂的秒,但仍然可行,我应该认为
1-86400范围(每天秒)
P>个人认为,我不认为这些论点足够足以避免使用DATESTIME或SMODEDATEDATION。
- INT和SMALLDATETIME使用4个字节
- 人们在使用SMALLINT时出错,导致隐式类型转换(增加cpu负载)
- 磁盘空间很便宜,您需要大量字节才能添加到任何重要内容
- 与时间<12:00'
- 显示问题(如DATETIME到hh:mm的转换)通常是客户端中的最佳位置
- 使用DATETIME允许将来的灵活性,例如移动到秒而不是分钟
在选择类型时,我最大的考虑是如何使用值;确保代码清晰易读并执行计划。SQL 2008修复了此问题,正如其他人所指出的,但在2005年: 你需要在《泰晤士报》上计算日期吗?如果不是,则可以将其存储为字符串 如果您需要执行日期数学,那么将日期设置为零的datetime以及描述性列名不应该妨碍任何未来的开发人员(感谢您记住我们)
是的,datetime对于纯时间存储来说很笨重,但它的功能还不错。这是SQL Server 2008还是更高版本(交叉手指),因为这样你就可以使用时间数据类型了。SQL Server 2008+有一个时间数据类型:SQL Server在2008年引入了一个数据类型。这目前只适用于
SQL Server 2008
。@JNK true,但作者并没有指定版本要求。我知道,但在这些情况下,您只需要确保对其进行限定。如果未指定版本,但您的解决方案是特定于版本的,请在回答中提及。有趣。如果我想要小时、分钟和秒,你知道吗?我会使用范围0到n-1
;午夜通常被认为是一天开始时的第一个瞬间,而不是一天结束时的最后一个瞬间。(这取决于具体情况,但根据我的经验,这是非常正常的。)@Dems-范围实际上与逻辑无关,但非常重要。如果您关心的是未来的维护,那么这是一个糟糕的解决方案。完整的日期时间将更加明显。我只会在需要的时候使用它。@Helgi-很高兴能提供帮助,感谢您编辑答案,以澄清对您有用的内容。+1-所有这些都是非常有效的分数。我关于答案中字节的观点可能与我的个人经历有关。我有很多非常大(600m-2b行)的表,如果我能将每行的字节数减少几字节,它就会很快累加起来。非常正确,但有一个强有力的论据认为,即使4GB也相对较小。+1 SQL Server 2005已经有了“生命的尽头”—肯定是升级的时候了!你知道它是如何与商业的、封闭源代码的软件一起工作的!在您必须升级之前,拥有成本并不重要。;)
DECLARE @dt as TIME
SET @dt = getdate()
PRINT @dt
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