我有以下问题:
活动有一个“开始”和“结束”时间和金额。 我使用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”
第一种是最简单的,但它会错过任何重叠,如果我有很多不同的事件和需要检查,我不“超额预定”,即该事件单项金额不超过总金额(例如:如果每个事件与一些人的预约表的,我不能在任何给定的时间超过表的总数)
这是很常见的时候有日期时间的工作范围,您使用的范围是在开始的包容性和排他性底。 例如:
(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/End
或Start/Stop
。 就个人而言,我觉得条件最好的一组,当你有一个包容/独家范围是使用Start/Until
。 它有两个术语是5个字符,排队按字母顺序,并明确传达的结束日期是唯一的额外优势。
此外,当你在谈论不同的事件,您应该录制倍UTC防止各地时区的困惑。 这是本地应用程序甚至是重要的,因为很多时区经过夏令时转换。 你不想让你在数据库中记录的值是不明确的。 在MySQL中,你可以使用TIMESTAMP
数据类型,以确保值存储为UTC,或者您可以使用DATETIME
数据类型,如果你能确保你与UTC值在应用程序代码的工作。