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

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

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

您期望得到的结果?

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

延伸问题

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

出招吧各位!!!

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

Keep it Simple, Stupid
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《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和当前营业状态及营业时间规则,然后存到数组或者文件中。接下来服务只需要遍历存储的数据,解析营业规则再判断是否需要修改营业状态,推送到业务系统就可以了。

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

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

1年前 评论
笑逐颜凯 (楼主) 1年前
讨论数量: 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和当前营业状态及营业时间规则,然后存到数组或者文件中。接下来服务只需要遍历存储的数据,解析营业规则再判断是否需要修改营业状态,推送到业务系统就可以了。

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

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

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

简单的营业时间配置: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小时营业

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

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

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

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

字段营业时间 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:是否在数组中

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

@笑逐颜凯

#比如要查询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)
1年前 评论
笑逐颜凯 (楼主) 1年前
porygonCN 1年前

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

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

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

1年前 评论

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

1年前 评论

按照某种格式存储也行,参考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和当前营业状态及营业时间规则,然后存到数组或者文件中。接下来服务只需要遍历存储的数据,解析营业规则再判断是否需要修改营业状态,推送到业务系统就可以了。

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

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

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

直接单独一个表存储,

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

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

1年前 评论

根本不存在跨天。

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

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

1年前 评论

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