查询以选择直到特定日期的天数

时间:2018-08-29 07:40:17

标签: mysql date

或者我的大脑无法像今天那样运转,或者实际上这是一件很难的事情。

我有包含用户的下表。

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'
)

任何人都可以帮助我进行查询吗?

4 个答案:

答案 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);

http://www.sqlfiddle.com/#!9/71573/7

答案 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()

SQLFiddle Demo

答案 2 :(得分:1)

使用NOW() - INTERVAL WEEKDAY(birthdate) +2 DAY获取上一个星期六日期。

然后使用daymonth函数获取日期和月份编号,然后在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())))