日期时间开始日期时间结束
我恳请您改用 两个 DATETIME 值,分别标记为 event_start 和 event_end。
时间是一项复杂的业务
世界上大部分地区现在都采用基于denery 的公制系统来进行大多数测量,无论对错。总的来说这很好,因为至少我们都同意 g 是 ml 是立方厘米。至少大致如此。公制有很多缺陷,但至少在国际上一直存在缺陷。
然而,随着时间的推移,我们有; 1000 毫秒一秒,60 秒到一分钟,60 分钟到一小时,每半天 12 小时,每月大约 30 天,每个月甚至每年都会有所不同,每个国家/地区的时间都与其他国家/地区不同,每个国家/地区的时间格式不同。
要消化的东西很多,但总之这么复杂的场景不可能有一个简单的解决方案。
有些角落可以被削减,但有些角落最好不要这样做
虽然这里的最佳答案建议您存储午夜后的整数分钟似乎完全合理,但我已经学会了避免这样做。
实现两个 DATETIME 值的原因是为了提高准确性、分辨率和反馈。
当设计产生不良结果时,这些都非常方便。
我存储的数据是否超出了要求?
最初似乎存储的信息比我需要的多,但有充分的理由接受这一打击。
从长远来看,存储这些额外信息几乎总能节省我的时间和精力,因为我不可避免地发现,当有人被告知某件事花了多长时间时,他们还会想知道事件发生的时间和地点也是。
这是一个巨大的星球
过去,我一直因忽视这个星球上除了我自己的国家之外还有其他国家而感到内疚。这在当时似乎是个好主意,但这总是会导致问题、头痛和后来的时间浪费。始终考虑所有时区。
C#
DateTime 可以很好地呈现为 C# 中的字符串。 ToString(string Format) 方法紧凑且易于阅读。
例如
new TimeSpan(EventStart.Ticks - EventEnd.Ticks).ToString("h'h 'm'm 's's'")
SQL 服务器
此外,如果您正在阅读与应用程序界面分开的数据库,那么 dateTimes 很容易一目了然,并且对它们执行计算也很简单。
例如
SELECT DATEDIFF(MINUTE, event_start, event_end)
ISO8601 日期标准
如果使用 SQLite,则没有此功能,因此请改用 Text 字段并将其存储为 ISO8601 格式,例如。
“2013-01-27T12:30:00+0000”
注意事项:
例如
TimeOffset=(±Longitude.24)/360
...其中±指东或西方向。
因此值得考虑是否值得将经度、纬度和高度与数据一起存储。这会因应用而异。
根据我的经验,总是需要存储完整的日期和时间,无论我在开始项目时是否认为有。 ISO8601 是一种非常好的、面向未来的方法。
其他免费建议
还值得将事件像链一样组合在一起。例如。如果记录比赛,整个赛事可以按racer、race_circuit、circuit_checkpoints 和circuit_laps 分组。
根据我的经验,确定谁存储了记录也是明智之举。作为通过触发器填充的单独表或作为原始表中的附加列。
投入越多,得到的越多
我完全理解希望尽可能节省空间的愿望,但我很少会以丢失信息为代价这样做。
数据库的经验法则正如标题所说,数据库只能告诉您它所拥有的数据,而且回溯历史数据以填补空白可能会非常昂贵。
解决方案是第一次就正确。这当然说起来容易做起来难,但您现在应该对有效的数据库设计有更深入的了解,并且随后更有可能在第一次就做好。
您的初始设计越好,以后的维修成本就越低。
我只说这一切,因为如果我能回到过去,那么当我到达那里时,我会告诉自己。