回答

收藏

设计不重叠的日期时间事件

技术问答 技术问答 109 人阅读 | 0 人回复 | 2023-09-13

我有以下问题:$ G, G9 R6 l# i$ c+ K
事件有开始和结束的时间和数量。我两个都用。MySQL DATETIME。  m0 i9 Z: w) g5 W
现在,如果我有一个约束条件说没有重叠事件,我需要做一些检查,但如何设计呢?用户只需要大约5分钟的精度,但我想用几秒钟来计算,因为它更简单3 F& ], r$ I0 F9 x0 {
/更清洁
- Q9 Y; C6 {. {假如我有事件(A),它的起点是 YYYY-MM-DD 12:00:00”-“ YYYY-MM-DD 14:00:00”2 q: o$ [# y3 |5 P
还有一个
$ a1 |8 e- W! l* ]# @" q(B)“ YYYY-MM-DD 14:00:00”-“ YYYY-MM-DD 16:15:00”->即使它们都包含14:00:00,它们也不重叠。) b, P' Y. O1 S% M
我应该使用它们,以确保它们不重叠。1 L/ W2 n* W. m# i( k; w5 x) M" \$ s
A.end [B]
: g1 [- t5 [1 ?* V或者
' H, P& ?% B2 B" z: z3 _A.end
* ~3 [1 W7 H6 t  c- b第一个是最简单的方法,但如果我有很多不同的事件,需要检查我没有超额预订,即事件的单个金额不超过总数(例如,如果每个事件,它将失去所有重叠)是预订最多的桌子,我不能超过任何给定的时间)& m% L1 B8 }. G1 B! _4 ~; A5 |
                                                               
; `4 r2 a5 O6 C& P# T. r; I5 j7 }    解决方案:                                                               
/ [& W$ B& m# X5 w/ j# s* }                                                                在处理日期的时间范围内,开始时通常包含一个范围,结束时不包含一个范围。
" ]7 k$ Q1 S! m4 Z(using ISO8601 formatting)Start                  End2013-04-29T01:00:00Z - 2013-04-29T02:00:00Z2013-04-29T02:00:00Z - 2013-04-29T03:00:00Z当小于或等于开始且大于(但不等于)结束时,值在范围内。在上述示例中,02:00属于第二个范围,而不是第一个范围。换句话说:  A: j5 u2 P# V& m& q
Start 或等效地,1 r0 c+ N; J, O% D, |
Start  value间隔符号用于数学,称为半开间隔。8 u1 v3 O' T, }4 j* t8 m
[Start,End)01:59:599:59使用这样一个值的想法更好。考虑一下我是否减去了End -Start为了得持续时间。我希望答案是一个小时,而不是59分59秒。
7 ?  b  h" ~* k/ z3 B* @  R# _# Q大多数例子都使用这些术语Start/End,但有时你会看到Begin/End或Start/Stop。就个人而言,我认为当你有范围/排除范围时,最好使用一组术语Start/Until。它有两个术语都是五个字符,按字母顺序排列,结束日期是排他性的优势。
1 V/ V) o- w! J# [9 O% \" i此外,在谈论不同的事件时,应记录时间UTC,为了防止时区周围的混乱。这甚至对本地应用程序非常重要,因为许多时区已经通过夏季系统转换。您不希望您在数据库中记录的值模棱两可。MySQL你可以用它TIMESTAMP数据类型确保值存储UTC,或者,DATETIME如果能在应用程序代码中使用UTC数据类型可用于值。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则