各位,有个疑问,像美团,饿了么这种门店是如何存储门店的营业时间?

如题,各位你们是如何处理像门店这种营业时间的存储?

因为像正常情况下存储门店的一样时间,早上 8 点到晚上 20 点,没问题。如果出现跨天的怎么处理?
如何存储才能更高效率的获取在营业时间内的门店。

您期望得到的结果?

存储门店营业时间,能满足跨天的需求,高效率 获取所有在营业时间内的门店。

延伸问题

如果门店是时间段营业又如何设计呢?

出招吧各位!!!

各位,有个疑问,像美团,饿了么这种门店是如何存储门店的营业时间?

Keep it Simple, Stupid
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

按照某种格式存储也行,参考crontab的设计,可以实现比较复杂的场景,同时可以配置多规则,转为JSON存储起来,查询后解析一下规则就行了。

  • 24小时营业
  • 每天10点营业至20点
  • 2月份6点营业至18点
  • 2022年5月份7点营业至19点
  • 2023年8月6日13点营业至15点
* * * * *
* * * 10:00 20:00
* 02 * 06:00 18:00
2022 05 * 07:00 19:00
2023 08 06 13:00 15:00

门店少的情况下配合任务调度,更新当前门店的是否营业字段。

门店多的情况下就比较复杂了,建议写一个服务来处理,假设门店修改了营业时间,业务系统需要推送到这个服务,服务接收门店ID和当前营业状态及营业时间规则,然后存到数组或者文件中。接下来服务只需要遍历存储的数据,解析营业规则再判断是否需要修改营业状态,推送到业务系统就可以了。

这种方案查询当前营业的门店很简单,但是对营业时间段的筛选查询就比较困难了,不过我觉得可以再完善一下能够支持这种场景。

当然这种方案实现起来比较复杂,但是支持的场景比较多,一般项目不建议使用。

2年前 评论
笑逐颜凯 (楼主) 2年前
讨论数量: 23

按照某种格式存储也行,参考crontab的设计,可以实现比较复杂的场景,同时可以配置多规则,转为JSON存储起来,查询后解析一下规则就行了。

  • 24小时营业
  • 每天10点营业至20点
  • 2月份6点营业至18点
  • 2022年5月份7点营业至19点
  • 2023年8月6日13点营业至15点
* * * * *
* * * 10:00 20:00
* 02 * 06:00 18:00
2022 05 * 07:00 19:00
2023 08 06 13:00 15:00

门店少的情况下配合任务调度,更新当前门店的是否营业字段。

门店多的情况下就比较复杂了,建议写一个服务来处理,假设门店修改了营业时间,业务系统需要推送到这个服务,服务接收门店ID和当前营业状态及营业时间规则,然后存到数组或者文件中。接下来服务只需要遍历存储的数据,解析营业规则再判断是否需要修改营业状态,推送到业务系统就可以了。

这种方案查询当前营业的门店很简单,但是对营业时间段的筛选查询就比较困难了,不过我觉得可以再完善一下能够支持这种场景。

当然这种方案实现起来比较复杂,但是支持的场景比较多,一般项目不建议使用。

2年前 评论
笑逐颜凯 (楼主) 2年前
2年前 评论
笑逐颜凯 (楼主) 2年前
2年前 评论
笑逐颜凯 (楼主) 2年前

简单的营业时间配置:24小时制,两个字段,start_timeend_time

  1. 如果start_time>end_time 跨天,如18:00~6:00=下午18点到次日早上6点
  2. 如果start_time<end_time 不跨天,如6:00~18:00=早上6点到下午18点
  3. 如果start_time=end_time 24小时营业,如6:00~6:00=24小时营业

当然,当日是否营业还有别的表配置,比如按星期休息,指定某日休息等

2年前 评论
笑逐颜凯 (楼主) 2年前
kolin 2年前
笑逐颜凯 (楼主) 2年前
kolin 2年前

github.com/spatie/opening-hours 这个包也不错

2年前 评论
笑逐颜凯 (楼主) 2年前

字段营业时间 json 全天 [0,1,2,3.....23]; 一天8:00-12:00,14:00-20:00 [8,9,10,11,14.....,19]; 一天8:00-18:00 [8,9,10,.....,17]; 跨天20:00-6:00 [20,21,22......,5 ];

查询 whereIn H:是否在数组中

2年前 评论
笑逐颜凯 (楼主) 2年前
lizzj (作者) 2年前

@笑逐颜凯

#比如要查询11点57分在营业的门店
select shop_id from tb_shop_time
where (start_time>end_time and (start_time <= '11:57' or end_time>='11:57'))
or (start_time<end_time and start_time<= '11:57' and end_time>='11:57')
or (start_time=end_time)
2年前 评论
笑逐颜凯 (楼主) 2年前
porygonCN 2年前

ES数据库或者redis存一份今天营业的,记录他的时间段。定时任务来对状态进行更改也是可以的,如果数据规模大,可以根据地域来区分节点和分片。这样店家临时有事也可以快速的更改状态来进行关门的动作,数据库存原数据。查询全部走ES和redis。

2年前 评论
wdnmd (作者) 2年前

美团的 :00:00-02:00, 18:00-23:59

2年前 评论

开始、结束两个字段均为秒数,后端存储如果跨天时结束时间在86400后累积,查询时将小时转为秒数,并自增86400秒兼容跨天数据 newNow = now + 86400 (now >= start AND now <= end) OR (newNow >= start AND newNow <= end)

2年前 评论

按照某种格式存储也行,参考crontab的设计,可以实现比较复杂的场景,同时可以配置多规则,转为JSON存储起来,查询后解析一下规则就行了。

  • 24小时营业
  • 每天10点营业至20点
  • 2月份6点营业至18点
  • 2022年5月份7点营业至19点
  • 2023年8月6日13点营业至15点
* * * * *
* * * 10:00 20:00
* 02 * 06:00 18:00
2022 05 * 07:00 19:00
2023 08 06 13:00 15:00

门店少的情况下配合任务调度,更新当前门店的是否营业字段。

门店多的情况下就比较复杂了,建议写一个服务来处理,假设门店修改了营业时间,业务系统需要推送到这个服务,服务接收门店ID和当前营业状态及营业时间规则,然后存到数组或者文件中。接下来服务只需要遍历存储的数据,解析营业规则再判断是否需要修改营业状态,推送到业务系统就可以了。

这种方案查询当前营业的门店很简单,但是对营业时间段的筛选查询就比较困难了,不过我觉得可以再完善一下能够支持这种场景。

当然这种方案实现起来比较复杂,但是支持的场景比较多,一般项目不建议使用。

2年前 评论
笑逐颜凯 (楼主) 2年前

直接单独一个表存储,

shop_id,  start_at,endt_at
1,08:00, 12:00
1,13:00,15:00
1,17:00,23:00

查询的时候关联查询和去重查询应该就可以了,至于跨天。。跟产品说实现不了。。

2年前 评论

根本不存在跨天。

18:00 - 次日 2:00 记录为

00:00 ,01:59 18:00,23:59 两个时间段。

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!