2011-07-25 4 views
2

私はPythonでプログラミングしており、SQLAlchemyを使用して営業時間を保存しています。Python、SQLAlchemy:バイナリビットマスクとして営業時間を保存する

  1. ビットマスク
  2. としてバイナリでビジネスが開く時間が格納されている曜日、
  3. ビジネスがクローズ時間:
    の営業時間は、3つの部分で構成されています。

ビットマスクは次のように動作します。 7つの数字があり、0または1のいずれかであり、平日の異なるシーケンスを表します。各位置は曜日を表します。最初の位置は月曜日を表し、最後は日曜日を表します。たとえば、1111100は月曜日 - 金曜日、0000111、金曜日 - 土曜日を表します。また、私は軍事的な時間、0600を意味する午前6時と午後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'), 
}) 

曜日を表す2つのビットマスクが重なっているときを判断するPythonicの方法は何ですか?また、Hoursオブジェクトの2つのペアが与えられたときにビジネスが現在開いているかどうかを調べる最も良い方法は何ですか?限り曜日をチェックなど

+1

これは、設定されている日に、その日の時間が同じであることを前提としていますか? – Santa

+0

また、重複はどういう意味ですか? – Santa

+0

重複すると、私は紛争を意味します。私は特定のビジネスのために勤務時間を保管していますが、午前8時から午後5時までです。それから、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)のいずれかに変換するのが最も簡単です。

"現在オープンしている時間オブジェクトの2つのペア"という意味がわかりません。あなたは2つの時間のペアの重複をしたいですか?彼らが一時間であれば、簡単です:

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

あなたは両方の範囲で時間のリストを提供します。

+0

@awfullyjohn答えがあなたに役立った場合は、質問への回答を受け入れることを忘れないでください。 – agf