我想将时间存储在数据库表中,但只需要存储小时和分钟.我知道我可以使用DATETIME并忽略日期的其他组件,但是如果不存储比我实际需要的更多信息,最好的方法是什么?
您可以将其存储为午夜过后分钟数的整数:
例如.
0 = 00:00 60 = 01:00 252 = 04:12
但是,您需要编写一些代码来重新构建时间,但这不应该是棘手的.
如果您使用的是SQL Server 2008+,请考虑TIME
数据类型.SQLTeam文章包含更多用法示例.
DATETIME开始DATETIME结束
我恳请您使用两个DATETIME值,标记为event_start和event_end.
时间是一项复杂的业务
世界上大多数人现在已经采用基于denery的度量系统进行大多数测量,无论是对还是错.总的来说这是好的,因为至少我们都同意ag,是ml,是立方厘米.至少差不多.公制系统存在许多缺陷,但至少它在国际上一直存在缺陷.
然而,随着时间的推移,我们有 一秒钟内1000毫秒,60分钟到一分钟,60分钟到一小时,每半天12小时,每月大约30天,根据月份甚至年份的不同而不同,每个国家的时间与其他国家相比有所不同,每个国家的时间格式各不相同.
消化很多,但是这种复杂场景的长短不可能有一个简单的解决方案.
有些角落可以被削减,但有些角落可以不被削减
虽然这里的最佳答案表明你在午夜过后存储整数分钟看似完全合理,但我已经学会了避免这么做.
实现两个DATETIME值的原因是为了提高准确度,分辨率和反馈.
当设计产生不良结果时,这些都非常方便.
我存储的数据多于要求的数据吗?
最初可能看起来存储的信息比我要求的要多,但是有充分的理由采取这种方式.
存储这些额外的信息几乎总是最终节省了我长时间的时间和精力,因为我不可避免地发现,当某人被告知事情花了多长时间时,他们还想知道事件发生的时间和地点.
这是一个巨大的星球
在过去,我一直无视这个星球上除了我自己以外的其他国家.这在当时似乎是一个好主意,但这总是导致问题,头痛和后来的浪费时间.始终考虑所有时区.
C#
DateTime很好地呈现给C#中的字符串.ToString(字符串格式)方法紧凑且易于阅读.
例如
new TimeSpan(EventStart.Ticks - EventEnd.Ticks).ToString("h'h 'm'm 's's'")
SQL服务器
此外,如果您正在将数据库分别读取到您的应用程序界面,那么dateTimes很容易一目了然地阅读,并且对它们执行计算非常简单.
例如
SELECT DATEDIFF(MINUTE, event_start, event_end)
ISO8601日期standards
如果使用SQLite,那么你没有这个,所以改为使用Text字段并以ISO8601格式存储它,例如.
"2013-01-27T12:30:00 + 0000"
笔记:
这使用24小时制*
ISO8601的+0000部分直接映射到GPS坐标中的晶格.因此,值得考虑是否值得存储经度,纬度和高度以及数据.这在应用上会有所不同.
ISO8601是一种国际格式.
维基非常适合http://en.wikipedia.org/wiki/ISO_8601的详细信息.
日期和时间以国际时间存储,并根据世界存储时间的位置记录偏移量.
根据我的经验,总是需要存储完整的日期和时间,无论我是否认为我开始项目的时间.ISO8601是一种非常好的,未来的方法.
免费提供额外建议
同样值得将事件组合在一起就像一个链条.例如,如果记录比赛,整个事件可以按racer,race_circuit,circuit_checkpoints和circuit_laps分组.
根据我的经验,识别存储记录的人也是明智之举.作为通过触发器填充的单独表格或作为原始表格中的附加列.
你投入的越多,你就越多
我完全理解尽可能节省空间的愿望,但我很少会以丢失信息为代价.
对数据库的经验法则如标题所述,数据库只能告诉您数据的数据,并且回顾历史数据,填补空白可能成本非常高.
解决方案是第一次让它正确.这说起来容易做起来难,但您现在应该对有效的数据库设计有更深入的了解,并且随后第一次就能更好地完成它.
初始设计越好,后期维修的成本就越低.
我只说这一切,因为如果我能及时回去,那就是当我到达那里时我会告诉自己的.
只需存储常规日期时间并忽略其他所有内容.为什么要花费额外的时间编写加载int的代码,操作它,并将它转换为日期时间,当你只能加载日期时间?