每周时间表 - 如何将其存储在数据库中?

时间:2008-12-23 16:28:09

标签: database datetime data-structures timespan

目前,我正在开发一个项目来管理服务器等数据库上的维护窗口。基本上,我只需要精确到一小时,但允许将它们设置为允许或禁止,一周中的每一天。

我对如何做到这一点有一些想法,但由于我自己工作,我不想在没有反馈的情况下做任何事情。

要想象这一点,就像流动的“图表”

    | Sun | Mon | Tue | Wed | Thu | Fri | Sat |
    -------------------------------------------
5AM |allow|allow|allow|deny |deny |allow|allow|
    -------------------------------------------
6AM |allow|deny |deny |deny |deny |deny |allow|
    -------------------------------------------
7AM |allow|deny |deny |deny |deny |deny |allow|
    -------------------------------------------
8AM |allow|deny |deny |deny |deny |deny |allow|
    -------------------------------------------
9AM |allow|deny |deny |deny |deny |deny |allow|
    -------------------------------------------
... etc... 

有没有一种标准的方法可以做到这一点或资源可能会给我一些想法......

  1. 制作可以轻松保存和恢复的格式
  2. 使其可以在数据库中搜索(例如,无需反序列化以搜索时间)
  3. [更新]

    值得一提的是,即使不太可能,也可以设置为“允许,拒绝,允许,拒绝......等等”。跨度不能保证是全天唯一的。

    这也不是唯一的时间表,会有数百台设备各自有自己的时间表,所以它会变得毛茸茸......哈哈?

    Rob 询问是否需要跟踪每周 - 事实并非如此。这是一个适用于整年的通用计划(定期维护)

7 个答案:

答案 0 :(得分:10)

我会考虑(1)使用包含开始和结束时间的格式,以及一周中某一天的整数字段。我知道你说这些块总是一个小时,但是你的代码可以强制执行。此外,如果您的要求在某一天发生变化,那么在步骤(2)中您所担心的要少于您的DB语句全部写入假设1小时的时间段。

CREATE TABLE maintWindow (
   maintWindowId  int primary key auto_increment not null,
   startTime      Time,
   endTime        Time,
   dayOfWeek      int,
   ...

对于(2),如果每条记录都有与之关联的开始和结束时间,那么在任何给定时间内检查窗口都非常容易:

SELECT maintWindowId
FROM maintWindow
WHERE $time >= TIME(startTime) AND $time <= TIME(endTime) AND DAYOFWEEK($time) = dayOfWeek

(其中$time表示您要检查的日期和时间)。

允许或不允许每周的每一天都由单独的记录处理。恕我直言,这比一周中每一天的硬编码更灵活,因为您将使用某种案例陈述或if-else切换到您感兴趣的那一天检查正确的DB列。 / p>

注意:请确保您知道数据库在一周中的整数日使用哪种标准,并尝试使您的代码独立于此(始终询问数据库)。我们在本周开始时(星期日或星期一)和起始指数(0或1)有不同标准的乐趣。

答案 1 :(得分:2)

如果每周都不同,那么就像这样设置表格;

TABLE:
    StartTime DATETIME    PrimaryKey

如果设置了特定日期/小时的开始时间,则假定它是允许的,否则拒绝。

如果它是通用周的通用配置,但不要更改,请尝试此操作;

TABLE:
    Hour  INT,
    Day   INT,
    Allow BIT

然后为每个小时/天组合添加行。

答案 2 :(得分:1)

之前我实际上使用过这个设计,基本上是为你想要定期安排的时间跨度创建一个位图除以你想要的周期数。因此,在您的示例中,您需要一个包含每小时周期的周计划,因此您将拥有一个长度仅为21个字节的168位位图。几个日期时间一起是16个字节,你需要多行来表示给定周的可能时间表,所以如果你完全关心大小,我认为你不能打败它。

我承认与以前的建议相比,处理起来有点棘手,而且不够灵活。考虑一下,如果您突然想要使用1/2小时的时段,则需要将所有现有数据转码为新的336位位图并分配值。

如果您正在使用SQL,您可以将其存储为二进制博客,并进行比较,以比较自己是打开还是关闭,或者您可以将每个位存储为列。 MS SQL Server支持最多1024个标准或30k宽表,因此您可以轻松地将粒度降低到10分钟,或者对于30k表来说更精细。

我希望这会对如何做到这一点有所不同。只有当你担心空间/尺寸或者你有大概数百万或者数百万的时候才真正有必要。

答案 3 :(得分:1)

您可以轻松地在表格中记录“允许”时间。这样,如果不存在,则不允许。如果您需要更多变量“计划”,则可以轻松添加年份和月份字段。

 TABLE DBMaintSched
      ID int PK
      ServerID varchar(30) (indexed)
      Day int
      Month char(3)
      DayOfWeek char(3)
      Year int
      StartDT DateTime
      EndDT DateTime

2008年12月:

 SELECT * FROM DBMaintSched WHERE ServerID = 'SQLSERVER01' AND Month = 'DEC' AND Year = 2008 ORDER BY DAY ASC

您可以在2008年12月的所有日子里进行维护。显示你想要的。

答案 4 :(得分:1)

每个提议的解决方案对我都有好处,无论如何,如果您遇到性能和/或表大小问题,我会考虑这个问题。由于您可能会在时间和实体(即服务器)之间建立关系,因此size_number * entity_times的大小将增加。如果每个时间跨度都有一行,那可能会很痛苦。

这个提议在表结构方面有点丑陋,但在磁盘空间和表扫描速度方面更有效。

TABLE times
    entityFK int -- your entity foreign key
    day INT      -- 0-7 day identifier
    bit time0    -- ON if the time 00:00 - 00:59 is being covered
    bit time1 
    bit time2
    -- more columns
    bit time23

考虑您希望在星期日和星期一将16:00 - 20:00正常运行时间分配给服务器的示例,您将只有两行,例如

entityFK | day | time16 | time17 | time18 | time19 | -- other bits are set to 0
server1    0     1        1        1        1
server1    1     1        1        1        1

您将假设每个缺失的行都意味着服务器已关闭。

如果您需要此功能,可以考虑使用日期列的DATE格式来设置特定日期(即仅在2013年10月2日至20:00之间的正常运行时间)。

希望有所帮助

答案 5 :(得分:0)

也许像

TABLE:
   StartTime DATETIME      PrimaryKey,
   EndTime   DATETIME      PrimaryKey,  /*if you are positive it will be in one hour incerments then you might want to omit this one*/
   Monday    BIT,
   TuesDay   BIT,
   Wednesday BIT,
   Thursday  BIT,
   Friday    BIT,
   Saturday  BIT,
   Sunday    BIT

答案 6 :(得分:0)

用Python编写,像这样的模块可以工作 - https://github.com/AndrewPashkin/pytempo