2011-07-25 43 views
2

我使用Python編程並使用SQLAlchemy存儲工作時間。
營業時間是由三個部分組成:Python,SQLAlchemy:將工作時間存儲爲二進制位掩碼

  1. 以二進制存儲爲一個位掩碼
  2. 業務打開時間一週的日子,
  3. 業務關閉的時間。

位掩碼的工作原理是這樣的。有7位數字,它們是0或1,它們代表不同的工作日順序。每個位置代表一週中的某一天。第一個位置代表星期一,最後一個代表星期日。例如,星期一至星期五爲1111100,星期五至星期六爲0000111。另外,我在軍事時間儲存小時,0​​600表示6AM,1800表示6PM。

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

那麼,這是否假設在設定的日子裏,那些日子的時間是一樣的? – Santa

+0

另外,你是什麼意思重疊? – Santa

+0

重疊我的意思是,衝突。假設我有特定業務的營業時間,M-F 8AM到5PM。然後我有人試圖爲F-Su 9AM添加另一個Hours對象到4PM。這些時候有衝突,因此必須調和。 – john

回答

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」週五重疊。

如果您實際上將整數存儲爲整數,則最簡單的辦法就是將它轉換爲一個,或者使用bin(bitmask)[2:]"{0:b}".format(bitmask)

我不確定您的意思是「當前打開...兩對小時對象」。你想要兩對小時的重疊嗎?如果他們是全天時間,它很容易:

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

會給你一個兩個範圍內的小時的列表。

+0

@awfullyjohn如果答案對你有幫助,請記住接受你的問題的答案。 – agf