Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Where子句:压缩字节存储星期几_Mysql_Sql - Fatal编程技术网

Mysql Where子句:压缩字节存储星期几

Mysql Where子句:压缩字节存储星期几,mysql,sql,Mysql,Sql,我的MySQL表中有一个名为AutoEventDays的列,名为WebEvents。它存储以下值: 0010000 0111110 每个数字代表一周中的一天,从星期日开始。零表示“当天不会发送邀请”,1表示“当天将发送邀请”。所以0010000的意思是“只在周二发送邀请”。而01111110表示“发送邀请M-F” 构造where子句的最有效方法是什么,这样,如果1与今天的匹配(由服务器时间决定),则返回该行,否则不返回。例如: On Tuesdays, this record will be

我的MySQL表中有一个名为
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'