建模一周的停电时间范围?

时间:2018-04-22 20:49:54

标签: postgresql

我正试图找到一种有效的方法来存储一周内的停电时间范围信息。我今天正在存储这样的一切:

create table access_restriction (
  id serial primary key,
  user integer references user(id),
  weekday integer not null, # ISO-8601 week day
  start time not null,
  end time not null,
);

因此,每当我必须检查用户是否被允许做某事时,我从那里选择所有内容并在应用程序代码上执行逻辑。使用PostgreSQL有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

使用现有结构,您可以将逻辑放在sql:

SELECT CASE WHEN COUNT(1) > 0 THEN true ELSE false END AS is_blacked_out
  FROM access_restriction a
  WHERE usr = :input_user_id
    AND weekday = :input_weekday
    AND start_time = (SELECT MAX(start_time)
                        FROM access_restriction
                        WHERE usr = a.usr
                          AND weekday = a.weekday
                          AND start_time <= :time_to_check
                     )
    AND end_time >= :time_to_check

有三个输入参数:

  • input_user_id
  • input_weekday
  • time_to_check

您可以将其更改为存储的函数。您需要检查边界条件(ex是end_time是否包含?)和假设,例如没有为用户配置重叠边界。

对于其他数据结构,您可以想象一个表示一周中时间的位图和一个将输入时间转换为位图的函数,该位图将与用户的中断位图“一起”。但这可能有点过分,而且实际上取决于用户数量,停电时间的粒度,停电时间变化的频率等等。