Python、SQLAlchemy:将工作时间存储为二进制位掩码
我正在用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
营业时间由三部分组成:
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如果答案对您有帮助,请记住接受您问题的答案。