Python、SQLAlchemy:将工作时间存储为二进制位掩码

Python、SQLAlchemy:将工作时间存储为二进制位掩码,python,sql,algorithm,binary,sqlalchemy,Python,Sql,Algorithm,Binary,Sqlalchemy,我正在用Python编程,并使用SQLAlchemy存储工作时间。 营业时间由三部分组成: 以二进制形式存储为位掩码的一周中的几天 公司开业的时候 业务结束的时间 位掩码是这样工作的。共有7位数字,分别为0或1,表示工作日的不同序列。每个职位代表一周中的一天。第一个位置代表星期一,最后一个位置代表星期天。例如,1111100表示星期一-星期五,0000111表示星期五-星期六。此外,我将时间存储为军事时间,0600表示上午6点,1800表示下午6点 hours=表('hours',Base.me

我正在用Python编程,并使用SQLAlchemy存储工作时间。
营业时间由三部分组成:

  • 以二进制形式存储为位掩码的一周中的几天
  • 公司开业的时候
  • 业务结束的时间
  • 位掩码是这样工作的。共有7位数字,分别为0或1,表示工作日的不同序列。每个职位代表一周中的一天。第一个位置代表星期一,最后一个位置代表星期天。例如,1111100表示星期一-星期五,0000111表示星期五-星期六。此外,我将时间存储为军事时间,0600表示上午6点,1800表示下午6点

    hours=表('hours',Base.metadata,
    列(“id”,整数,主键=True),
    列(“businessid”、整数、ForeignKey(“businesss.id”),
    列(“天数”,整数),
    列(“打开”,整数),
    列(“关闭”,整数),
    )
    课时(对象):
    定义初始(self,days=None,open=None,close=None):
    self.days=天
    self.open=打开
    self.close=关闭
    制图员(小时,小时)
    映射器(业务、业务、属性)={
    “小时”:关系(小时,backref='business'),
    })
    

    当表示一周中几天的两个位掩码重叠时,Pythonic方法是什么?另外,当给定两对小时对象时,找出企业当前是否营业的最佳方法是什么?

    至于检查一周中的几天,如果二进制是指格式为“1011011”的字符串:

    overlap = [n for n in range(7) if (bitmask1[n] == bitmask2[n] == '1')]
    
    将为您提供重叠日期的数字列表(从0到6)--[4]用于周五重叠

    overlap = ''.join(('1' if (bitmask1[n] == bitmask2[n] == '1') else '0') for n in range(7))
    
    将为您提供一个新的位掩码字符串--“00000100”,用于星期五重叠

    overlap = ''.join(('1' if (bitmask1[n] == bitmask2[n] == '1') else '0') for n in range(7))
    
    如果您实际上是将数字存储为整数,那么使用
    bin(位掩码)[2:
    “{0:b}.”格式(位掩码)
    将其转换为1可能是最简单的方法

    我不知道你所说的“当前打开……两对小时对象”是什么意思。你想要两对小时的重叠吗?如果是整小时,那么很容易:

    [hour for hour in range(firsthour, secondhour) if hour in range(openinghour, closinghour)
    

    将为您提供两个范围内的小时列表。

    因此,假设在设置的日期中,这些日期的小时数相同?另外,重叠是什么意思?重叠是指冲突。假设我为特定业务存储了工作时间,从上午8点到下午5点。然后我有人尝试为F-Su从上午9点到下午4点添加另一个小时对象。我明白了,这些时间冲突,因此必须和解。您需要基本的位操作技术。例如,M-F将是
    11111 00
    ,F-Su将是
    0000111
    。这两个选项中的“AND”将是
    0000100
    ,因此您希望“AND”结果在非重叠的情况下为零。@awfullyjohn如果答案对您有帮助,请记住接受您问题的答案。