Where子句:一周的紧凑字节存储日

时间:2017-10-22 22:11:02

标签: mysql sql

我的 MySQL 表中有一个名为AutoEventDays的列名为WebEvents。它存储以下值:

0010000
0111110

每个数字代表星期几,从星期日开始。零表示“当天不发送邀请”,一个表示“当天将发送邀请”。所以0010000表示“仅在星期二发送邀请”。 0111110表示“发送邀请M-F”。

构建where clause的最有效方法是什么,以便1匹配今天(由服务器时间确定),将返回该行,否则不。例如:

On Tuesdays, this record will be returned: 0010000 
On all non-Tuesdays this record will NOT be returned: 0010000 
On M-F this record will be returned: 0111110 
On weekends this record will NOT be returned: 0111110

重要提示:AutoEventDays是一个普通的字符(7),而不是数字或二进制。

我的想法一直把我带到丑陋,复杂和重复的where子句的道路上......我知道堆栈上的某个人会有一个有效的方法。提前谢谢。

3 个答案:

答案 0 :(得分:1)

您可以将LIKE与下划线和1一起使用以匹配字符串:

SELECT *
FROM WebEvents
WHERE
    (DAYNAME(CURDATE())='Sunday'    AND AutoEventDays LIKE '1______')
OR  (DAYNAME(CURDATE())='Monday'    AND AutoEventDays LIKE '_1_____')
OR  (DAYNAME(CURDATE())='Tuesday'   AND AutoEventDays LIKE '__1____')
OR  (DAYNAME(CURDATE())='Wednesday' AND AutoEventDays LIKE '___1___')
OR  (DAYNAME(CURDATE())='Thursday'  AND AutoEventDays LIKE '____1__')
OR  (DAYNAME(CURDATE())='Friday'    AND AutoEventDays LIKE '_____1_')
OR  (DAYNAME(CURDATE())='Saturday'  AND AutoEventDays LIKE '______1')

如果您创建一个带有蒙版的七行查找表,可以简化此方法:

CREATE TABLE DayMaskLookup (DayName VARCHAR(10), Mask CHAR(7))
INSERT INTO DayMaskLookup VALUES ('Sunday',    '1______')
INSERT INTO DayMaskLookup VALUES ('Monday',    '_1_____')
INSERT INTO DayMaskLookup VALUES ('Tuesday',   '__1____')
INSERT INTO DayMaskLookup VALUES ('Wednesday', '___1___')
INSERT INTO DayMaskLookup VALUES ('Thursday',  '____1__')
INSERT INTO DayMaskLookup VALUES ('Friday',    '_____1_')
INSERT INTO DayMaskLookup VALUES ('Saturday',  '______1')

现在您的查询将如下所示:

SELECT *
FROM WebEvents e
JOIN DayMaskLookup m ON e.AutoEventDays LIKE m.Mask
WHERE m.DayName = DAYNAME(CURDATE())

答案 1 :(得分:1)

如果值存储为(二进制)数字(您没有说明),则可以使用按位AND。星期一= 64,星期二= 32等。

其中邀请任务&周二> 0

答案 2 :(得分:1)

您可以使用dayofweek()和位操作:

where mask & (1 << (7 - dayofweek(curdate())) )

为什么要将面具存储为字符串?这似乎很奇怪。无论如何,你可以这样做:

where substr(mask, 7 - dayofweek(curdate()), 1) = '1'

这似乎比其他解决方案简单得多。