或者我的大脑无法像今天那样运转,或者实际上这是一件很难的事情。
我有包含用户的下表。
id | name | birthdate |
------+----------+------------
1 | John | 1990-08-27
2 | Jane | 1985-08-29
3 | Joe | 1985-08-31
birthdate
是上表的date
列。
我希望获得今天或前几天(包括周末)有生日的用户。
除了以下尝试之外,我没有其他尝试:
SELECT
*
FROM users
WHERE (DATE_FORMAT(users.birthdate, '%d-%m') IN (
'29-08',
'28-08',
'27-08',
'26-08'
)
任何人都可以帮助我进行查询吗?
答案 0 :(得分:1)
SELECT *
FROM users
WHERE DATE(users.birthdate + INTERVAL (YEAR(NOW()) - YEAR(users.birthdate)) YEAR)
BETWEEN
DATE(NOW() - INTERVAL WEEKDAY(NOW()) DAY)
AND
DATE(NOW() + INTERVAL 6 - WEEKDAY(NOW()) DAY);
答案 1 :(得分:1)
此查询应执行您想要的操作。首先,它将用户的出生日期转换为当前年份:
STR_TO_DATE(CONCAT(YEAR(CURRENT_DATE()), DATE_FORMAT(birthdate, '-%m-%d')), '%Y-%m-%d')
然后查看该日期是否在今天(CURRENT_DATE()
)和上一个星期六之间:
CURRENT_DATE() - INTERVAL (WEEKDAY(CURRENT_DATE()) - 5 + 7) % 7 DAY
完整查询:
SELECT *
FROM users
WHERE STR_TO_DATE(CONCAT(YEAR(CURRENT_DATE()), DATE_FORMAT(birthdate, '-%m-%d')), '%Y-%m-%d') BETWEEN
CURRENT_DATE() - INTERVAL (WEEKDAY(CURRENT_DATE()) - 5 + 7) % 7 DAY AND CURRENT_DATE()
答案 2 :(得分:1)
使用NOW() - INTERVAL WEEKDAY(birthdate) +2 DAY
获取上一个星期六日期。
然后使用day
和month
函数获取日期和月份编号,然后在where子句中签入。
month(birthdate)
与NOW()
月相同,
day
的 NOW()
号
您可以尝试一下。
CREATE TABLE users(
id INT,
name VARCHAR(50),
birthdate DATE
);
INSERT INTO users VALUES (1,'John' , '1990-08-27');
INSERT INTO users VALUES (2,'Jane' , '1985-08-29');
INSERT INTO users VALUES (22,'Joe' , '1985-05-31');
INSERT INTO users VALUES (33,'Joe' , '1985-08-11');
INSERT INTO users VALUES (3,'Joe' , '1985-08-31');
查询1 :
SELECT *
FROM users
WHERE
month(birthdate) = month(NOW())
AND
day(birthdate) between day(NOW() - INTERVAL WEEKDAY(birthdate) +2 DAY) and day(NOW())
Results :
| id | name | birthdate |
|----|------|------------|
| 1 | John | 1990-08-27 |
| 2 | Jane | 1985-08-29 |
答案 3 :(得分:0)
尝试以下查询:curdate()-INTERVAL DAYOFWEEK(curdate()),这将为您提供包括星期六在内的日期
SELECT * FROM users
WHERE day(users.birthdate)>=day(curdate() - INTERVAL DAYOFWEEK(curdate())) and <=day(curdate()) and (month(users.birthdate)=month(curdate()) or month(users.birthdate)=month(curdate() - INTERVAL DAYOFWEEK(curdate())))