设计不重叠的日期时间事件(Designing non-overlapping date-time e

2019-09-01 08:29发布

我有以下问题:

活动有一个“开始”和“结束”时间和金额。 我使用MySQL DATETIME两种。

现在,如果我有一个约束,说:“没有重叠的事件:”我需要做一些检查等,但如何设计? 用户只需要5分钟的精度左右,但我想要做的计算与秒,因为这是“简单的” /“清洁工”

如果我有一个开始 - 结束 “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等,并进行 “黑客”,使得所有最终时间是 “DATE HH:MM:00(负一秒)” 而不是 “DATE HH:MM:00”,即A.end那么将是 “YYYY-MM-DD 13时59分59秒”,而不是 “YYYY-MM-DD 14:00:00”

第一种是最简单的,但它会错过任何重叠,如果我有很多不同的事件和需要检查,我不“超额预定”,即该事件单项金额不超过总金额(例如:如果每个事件与一些人的预约表的,我不能在任何给定的时间超过表的总数)

Answer 1:

这是很常见的时候有日期时间的工作范围,您使用的范围是在开始的包容性和排他性底。 例如:

(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

A的值在范围时它比小于或等于开始,和更大(但不等于)的端部。 另外,在上述的例子中, 02:00属于第二范围,而不是第一个。 换一种说法:

Start <= value < End 

或者等价地,

Start <= value  AND  End > value

在数学上,使用间隔符号 ,这被称为“半开”的时间间隔。

[Start, End)

这始终是比使用的值等的理念更好的方法01:59:59 。 试想,如果我是减去End - Start得到持续时间。 我希望答案为一小时,而不是59分59秒。

大多数例子中使用的术语Start/End ,但有时你会看到Begin/EndStart/Stop 。 就个人而言,我觉得条件最好的一组,当你有一个包容/独家范围是使用Start/Until 。 它有两个术语是5个字符,排队按字母顺序,并明确传达的结束日期是唯一的额外优势。

此外,当你在谈论不同的事件,您应该录制倍UTC防止各地时区的困惑。 这是本地应用程序甚至是重要的,因为很多时区经过夏令时转换。 你不想让你在数据库中记录的值是不明确的。 在MySQL中,你可以使用TIMESTAMP数据类型,以确保值存储为UTC,或者您可以使用DATETIME数据类型,如果你能确保你与UTC值在应用程序代码的工作。



文章来源: Designing non-overlapping date-time events