我有一个想法是使用二进制字符串来存储每小时的可用性,我希望社区运行该字符串以获取建议。
我的想法是生成一个二进制字符串,指示一周中任何给定小时的可用性,使用“0”表示不可用,“1”表示可用。然后,我可以使用按位“和”运算符查询带有“当前小时”整数的二进制列。字符串看起来像下面的
# Open sunday at 6:00am and close at 6:00pm (repeats 0 for remainder of hours)
000000111111111111000000...
在星期日下午4:00查看该页面将使用前一个字符串按位“和”运行:
# 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
感谢阅读!任何反馈都表示赞赏。
答案 0 :(得分:4)
如果同时存储“开放时间”和“关闭时间”,您可能会感觉更好。这将使开发人员更容易处理。如果您在白天需要多个开放时段,例如早上开放,午餐关闭,然后在下午再次开放的地方,我建议您创建一个“开放时间”的表格。 “打开时间”和“关闭时间”以及链接回原始表的外键,以便您可以存储多个打开期间。你可能认为你对你的位置或东西很聪明,但实际上只是让事情变得更复杂。此外,您无法容纳半小时内发生的事情,甚至更精细的分辨率。重新阅读问题,我看到你要存储多天。如果你每天需要不同的开放时间,那么我的第二个解决方案就能很好地运作。有一张这样的桌子。
ID(INT),F_ID(INT),DAY_OF_WEEK(INT),OpenTime(时间),CloseTime(时间)
ID只是此表的自动增量,F_ID是返回原始表的外键,星期几可以是表示星期几的整数或枚举,OpenTime和CloseTime是可以存储时间的“时间”字段,没有约会。这应该让事情变得更加清晰,以及其他任何人将来必须处理代码。此外,查找可能会更快,因为您可以索引时间字段。执行二进制xor相当于使用“LIKE'%word%'来搜索字符串,应该避免使用。
答案 1 :(得分:0)
如果这是MySQL我会告诉你使用SET数据类型,但PostgesSQL似乎没有。相反,你需要BIT数据类型,它可以工作,但不是很方便。