我有一个想法,用一个二进制字符串来存储每小时的可用性,我想让社区运行它来获得建议。
我的想法是生成一个二进制字符串,表示一周中任何给定时间的可用性,使用"0“表示不可用,使用"1”表示可用。然后,我可以使用按位的"and“运算符,用整数查询”当前小时“的binary列。字符串将如下所示
# Open sunday at 6:00am and close at 6:00pm (repeats 0 for remainder of hours)
000000111111111111000000...在周日下午4:00查看页面时,将使用前一个字符串和以下内容逐位运行" and“:
# Sunday at 4:00pm (repeats 0 for remainder of hours)
000000000000000100000000如果返回的逐位比较结果值大于1,则该记录当前可用。
我有两个问题。第一个问题是我应该将值存储为哪种数据类型。最多168位值(7天* 24小时)。第二个问题是Postgres提供了哪些能够完成我提到的功能的函数。如下所示:
# String truncated for readability
WHERE some_column & $number_for_current_hour > 0感谢您的阅读!任何反馈都是值得感谢的。
发布于 2011-09-19 10:13:21
如果你同时存储“开放时间”和“关闭时间”,你可能会过得更好。这将大大简化开发人员的处理过程。如果您需要在一天中使用多个打开时间段,例如上午打开、午餐关闭、下午再次打开的地方,我建议您创建一个包含“打开时间”和“关闭时间”的“打开时间”表,以及链接回原始表的外键,以便可以存储多个打开时间段。你可能认为你是在聪明地处理你的位或其他东西,但实际上只是让事情变得更复杂。另外,你不能适应半小时内发生的事情,甚至不能适应更好的分辨率。再读一遍问题,我发现你想存储多天。如果您每天需要不同的打开时间,那么我的第二个解决方案将会很好地工作。有一张这样的桌子。
ID (INT),F_ID (INT),DAY_OF_WEEK (INT),OpenTime (时间),CloseTime (时间)
ID是该表的自动增量,F_ID是返回原始表的外键,星期几可以是表示星期几的整数或枚举,OpenTime和CloseTime是" time“字段,可以存储时间,不带日期。这应该会让你自己,以及将来需要处理代码的其他人更清楚地了解这一点。此外,它可能会更快地进行查找,因为您可以索引时间字段。执行二进制xor相当于使用"LIKE '%word%‘“来搜索字符串,应该避免这样做。
发布于 2011-09-19 10:46:25
如果这是MySQL,我会告诉您使用SET数据类型,但PostgesSQL似乎没有。相反,您将需要BIT数据类型,它可以工作,但不是很方便。
https://stackoverflow.com/questions/7465830
复制相似问题