我有以下问题:
事件有“开始”和“结束”时间和金额。我使用MySQL DATETIME。
现在,如果我有一个“没有重叠事件”的约束,我需要进行一些检查等但是如何设计呢?用户只需要5分钟左右的精度,但我想用秒进行计算,因为那是“更简单”/“更清洁”
如果我有一个事件(A)的开头“YYYY-MM-DD 12:00:00” - “YYYY-MM-DD 14:00:00”
和另一个
(B)“YYYY-MM-DD 14:00:00” - “YYYY-MM-DD 16:15:00” - >它们不重叠,即使它们都包含14:00:00。
为了确定它们确实不重叠,我应该使用
A.end< B.begin等。
或者
A.end< = B.begin等并且制作“hack”使得所有结束时间都是“DATE HH:MM:00(减去一秒)”而不是“DATE HH:MM:00”即A.end将是“YYYY-MM-DD 13:59:59”而不是“YYYY-MM-DD 14:00:00”
第一个是最简单的,但是如果我有很多不同的事件并且需要检查我没有“超量预订”,即事件个别金额不超过总金额,它会错过任何重叠(例如:如果每个活动都是预订有多人的餐桌,我不能超过任何特定时间的餐桌总数)
答案 0 :(得分:4)
使用日期时间范围时,使用范围在开始时包含并且在结尾处独占时非常常见。例如:
(using ISO8601 formatting)
Start End
2013-04-29T01:00:00Z - 2013-04-29T02:00:00Z
2013-04-29T02:00:00Z - 2013-04-29T03:00:00Z
当值小于或等于开始值且大于(但不等于)结束时,值在范围内。在上面的示例中,02:00
属于第二个范围,而不是第一个范围。换句话说:
Start <= value < End
或等效地,
Start <= value AND End > value
在数学中,使用Interval Notation,这被称为“半开”间隔。
[Start, End)
这总是比使用01:59:59
之类的值更好的方法。考虑我是否要减去End - Start
以获得持续时间。我希望答案是一小时,而不是59分59秒。
大多数示例都使用术语Start/End
,但有时您会看到Begin/End
或Start/Stop
。就个人而言,我认为当你有一个包容性/排他性范围时,最好使用的术语集是Start/Until
。它的另外一个优点是两个术语都是5个字符,按字母顺序排列,并明确表示结束日期是独家的。
此外,当您谈论不同的事件时,您应该将您的时间记录为UTC,以防止在时区周围混淆。这对于本地应用程序甚至很重要,因为许多时区都经历了夏令时转换。您不希望在数据库中记录的值不明确。在MySQL中,您可以使用TIMESTAMP
数据类型来确保将值存储为UTC,或者如果您可以确定在应用程序代码中使用UTC值,则可以使用DATETIME
数据类型