gpt4 book ai didi

java - 数据存储是否适合存储小时类次?

转载 作者:行者123 更新时间:2023-11-29 07:32:50 24 4
gpt4 key购买 nike

大家。我想弄清楚 Google Datastore 是否是我的最佳选择..

我需要存储员工的日程安排,例如:

id
name
schedule

时间表看起来像:

Mon   10am-10pm                 (simple)
Tue 10am-5pm, 5.30pm-8pm (multiple, not even hours)
..
Sun 6pm-4am (start/end are in different days)

其中一个 API 会返回员工是否正在工作

我尝试使用数据存储,但 GQL 查询似乎非常有限,例如您无法在一个查询中比较两个不同的属性(例如

.. WHERE current_time>start_time AND current_time<close_time

You cannot use inequality operators (less than, more than, etc.) on different property names in the same query.

这意味着我需要将大量实体加载到我的后台并解析它们,浪费时间和资源.. 而不是直接从数据库中获取结果

  1. 有什么方法可以为我的任务使用数据存储吗?还是使用 sql 更好?
  2. 如何设计我的数据库以将计划存储在 datasore/sql 中?

提前致谢!

最佳答案

根据您的示例,我假设工作轮类以 30 分钟为增量。如果不是这种情况,您可以轻松调整以下内容,但您可能需要考虑一些优化。

下面的解决方案将使您能够持续查询员工的时间,无论他们工作多少类次。它还可以无缝处理从一天到下一天的轮类。

0。你的实体模型

我将使用下面的稻草人实体

实体种类:员工
- id: 自动 id
- 名称:字符串
- 时间表:重复整数,索引

2。将一天分成 30 分钟的小块

24 小时为 48 个 30 分钟的时间段,所以让我们将整数映射到时间段:

  • 0 = 凌晨 12:00 到凌晨 12:30
  • 30 = 中午 12:30 到凌晨 1:00
  • 60 = 凌晨 1:00 到凌晨 1:30
  • ...
  • 1380 = 晚上 11:00 到晚上 11:30
  • 1440 = 晚上 11:30 到凌晨 12:00

这个整数很容易从您当前的时间推导出来。使用 java.util.Calendarjava.util.Date :

Date date = new Date(); // Initializes to now.
Calendar calendar = GregorianCalendar.getInstance();
calendar.setTime(date);
int hour = calendar.get(Calendar.HOUR_OF_DAY); // Hour in 24h format
int minute = calendar.get(Calendar.MINUTE); // Minute of the hour

int period = hour*60 + minute/30*30; // Integer division rounds down to nearest 30

我在 compilejava.net 上测试过,测试代码在这里:https://gist.github.com/55a98bbdb9b5eb3eeaee5f8984f11687

3。占星期几

现在我们在一天中有 30 分钟的周期 block ,我们应该在星期几(星期日 = 0,星期六 = 6)合并。由于最大 30 分钟周期值为 1440,因此只需将星期几乘以 10000 就很方便,这样我们就可以将它们加在一起而不会发生冲突:

int day = calendar.get(Calendar.DAY_OF_WEEK);
int day_period = day*10000 + period;

此处扩展测试代码:https://gist.github.com/217221e03b3eb143b4be45bf3f641d25

4。存储时间表

现在,不是将您的日程安排存储为每天的开始和停止时间,而是使用上面相同的想法来存储员工安排的每 30 分钟时间段。在您的示例中,您有:

Mon   10am-10pm                 (simple)
Tue 10am-5pm, 5.30pm-8pm (multiple, not even hours)
..
Sun 6pm-4am (start/end are in different days)

在计划字段(重复整数)中,这看起来像:

10600,10630,10660,10690,10720,10750,10780,10810,10840,10870,10900,10930,10960,10990,11020,
11050,11080,11110,11140,11170,11200,11230,11260,11290,20600,20630,20660,20690,20720,20750,
20780,20810,20840,20870,20900,20930,20960,20990,21050,21080,21110,21140,21170,1080,1110,
1140,1170,1200,1230,1260,1290,1320,1350,1380,1410,0,30,60,90,120,150,180,210

5.查询时间!

查询现在非常容易,只是一个平等。这将为您提供每个正在工作的员工实体的 O(1) 性能,或者更一般地说是 O(n),其中 n 是现在正在工作的员工数量(相对于员工总数)。

... WHERE schedule=day_period

关于java - 数据存储是否适合存储小时类次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39695582/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com