我的 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子句的道路上......我知道堆栈上的某个人会有一个有效的方法。提前谢谢。
答案 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'
这似乎比其他解决方案简单得多。