Mysql Where子句:压缩字节存储星期几
我的MySQL表中有一个名为Mysql Where子句:压缩字节存储星期几,mysql,sql,Mysql,Sql,我的MySQL表中有一个名为AutoEventDays的列,名为WebEvents。它存储以下值: 0010000 0111110 每个数字代表一周中的一天,从星期日开始。零表示“当天不会发送邀请”,1表示“当天将发送邀请”。所以0010000的意思是“只在周二发送邀请”。而01111110表示“发送邀请M-F” 构造where子句的最有效方法是什么,这样,如果1与今天的匹配(由服务器时间决定),则返回该行,否则不返回。例如: On Tuesdays, this record will be
AutoEventDays
的列,名为WebEvents
。它存储以下值:
0010000
0111110
每个数字代表一周中的一天,从星期日开始。零表示“当天不会发送邀请”,1表示“当天将发送邀请”。所以0010000
的意思是“只在周二发送邀请”。而01111110
表示“发送邀请M-F”
构造where子句
的最有效方法是什么,这样,如果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子句的道路……我知道堆栈上的某个人会有一个有效的方法。提前感谢。您可以使用带有下划线和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())
如果值存储为(二进制)数(您没有告诉),则可以使用按位AND。星期一=64,星期二=32等
在邀请函任务和星期二>0中,可以使用dayofweek()
和位操作:
where mask & (1 << (7 - dayofweek(curdate())) )
这似乎比其他解决方案简单得多。对不起,这是文本,不是二进制。掩码是字符串,不是数字。否则,很难存储OP示例中的前导零。请参见OP对另一个答案的评论。dasblinkenlight:您的答案看起来很有希望,但正如帖子中所述,AutoEventDays
是一个列,而不是一个表。该表名为WebEvents
。你能相应地调整你的答案吗?谢谢答对 了谢谢dasblinkenlight。
where substr(mask, 7 - dayofweek(curdate()), 1) = '1'