sql datetime whether two date range overlap

碰到一个需求,一个时间段内只允许有一个计划,也就是说数据库中的时间区间不能有重复或交叉,记录下从复杂到简单的简化过程。

1.刚开始想的时候感觉这个有很多种情况,然后把每一次情况都用sql标识出来,写的语句如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#情况如下:
# a: |------|
# b: |------|
# a.start_time >= start_at and a.start_time <= end_at
# a: |------|
# b: |------|
# a.end_time >= start_at and a.end_time <= end_at
# a: |------|
# b: |----------|
# a.start_time >= start_at and a.end_time <= end_at
# a: |----------|
# b: |------|
# a.start_time <= start_at and a.end_time >= end_at
#代码如下:
plan = Plan.where('((start_time >= ? and start_time <= ?) or (end_time >= ? and end_time <= ?) or (start_time >= ? and end_time <= ?) or (start_time <= ? and end_time >= ?) )',start_at, end_at, start_at, end_at, start_at, end_at, start_at, end_at)

rails项目优化 sql优化

因为项目的表数据量比较大,系统经常因为内存满而卡死,所以对整个rails项目进行了一次简单的优化,其中涉及到了几个比较关键的点,记录下来。假设有个product表,数量在百万级别的。

因为是rails项目所以里面会包含一些rails注意事项,还有一些简单的sql语句优化,水平有限,如果有什么不对的地方,还请邮件联系我。