在名为 WebEvents
的 MySQL 表中,我有一个名为 AutoEventDays
的列。它存储如下值:
0010000
0111110
每个数字代表一周中的一天,从星期日开始。 0 表示“当天不发送邀请”,1 表示“当天发送邀请”。所以 0010000
表示“仅在星期二发送邀请”。 0111110
表示“发送邀请 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
是一个普通的 char(7),不是数字或二进制。
我的想法一直让我走上丑陋、复杂和重复的 where 子句的道路……而且我知道堆栈上的某个人会有一个有效的方法。提前致谢。
最佳答案
您可以使用带下划线和下划线的 LIKE
来匹配字符串:
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())
关于mysql - 其中子句 : Compact byte storage day of week,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46879654/