Python,SQLAlchemy:将营业时间存储为二进制位掩码

时间:2011-07-25 23:26:51

标签: python sql algorithm binary sqlalchemy

我使用Python编程并使用SQLAlchemy来存储营业时间 营业时间由三部分组成:

  1. 以二进制形式存储的星期几作为位掩码
  2. 业务开放的时间,
  3. 业务关闭的时间。
  4. 位掩码的工作原理如下。有7个数字,分别为0或1,代表工作日的不同序列。每个职位代表一周中的某一天。第一个位置代表星期一,最后一个代表星期日。例如,1111100表示​​周一至周五,0000111表示周五至周六。此外,我在军事时间存储小时,0600表示早上6点,1800表示下午6点。

    hours = Table('hours', Base.metadata,
        Column("id", Integer, primary_key=True),
        Column("businessid", Integer, ForeignKey('businesses.id')),
        Column("days", Integer),
        Column("open", Integer),
        Column("close", Integer),
    )
    
    class Hours(object):
        def __init__(self, days=None, open=None, close=None):
            self.days = days
            self.open = open
            self.close = close
    
    mapper(Hours, hours)
    mapper(Business, businesses, properties={
        'hours': relationship(Hours, backref='business'),
    })
    

    什么是Pythonic方法来确定代表星期几的两个位掩码何时重叠?而且,当给出两对小时对象时,找出业务当前是否处于打开状态的最佳方法是什么?

1 个答案:

答案 0 :(得分:3)

就检查一周中的几天而言,如果是二进制,则表示形式为'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'表示星期五重叠。

如果您实际上将数字存储为整数,那么将{1}}或bin(bitmask)[2:]转换为1可能是最简单的。

我不确定你的意思是“目前开放...两对小时的物体”。你想要两对小时的重叠吗?如果他们是整个小时,那很容易:

"{0:b}".format(bitmask)

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