时间段记录小技巧

今天看代码的时候,遇到了一段奇怪的的语句

(`Campaigns`.`time_target` & :h1) = :h2

上面是一段 SQL 的条件语句,今天首先看到后,我就开始琢磨了,这一段是干什么的,然后顺着这条 SQL 做的事情,一直摸到了前端,才发现了这是一段时间段的查询语句。

举个例子,有一个需求,需要用户从0-23这段时间段中选择每个小时记录来做某些事。 我看到这个需求,我会在数据库里建一个单独的表来存每个时间段,或者存在一个数组(长度为24),选中就为1,未选中为0,然后序列化一下存到数据库里。而上面那段 SQL 的做法我觉得更醋一些,效率也应该更高一些。

其实在查询语句前还有一个操作,例如用户选择了2,3,18这三个时间段,那个就做下面的操作

h1 = 2**2 + 2**3 + 2**18  

这样就把这三个数字存下来了 然后看当前时间段是否符合这三个选中的时间段只需要做下面操作

now = 2**18 #  
例如现在为18
if h1 & now == now:  
    print True
else:  
    print False

无法用语言来形容了,代码一看就清楚了。