Запрос на выбор дней до определенной даты - PullRequest
0 голосов
/ 29 августа 2018

Либо мой мозг функционирует не так, как сегодня, или это на самом деле трудная задача.

У меня есть следующая таблица, содержащая моих пользователей.

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 голосов
/ 29 августа 2018

использовать 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())

Результаты

| id | name |  birthdate |
|----|------|------------|
|  1 | John | 1990-08-27 |
|  2 | Jane | 1985-08-29 |
0 голосов
/ 29 августа 2018
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

0 голосов
/ 29 августа 2018

Этот запрос должен делать то, что вы хотите. Сначала он переводит дату рождения пользователя в текущий год:

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

0 голосов
/ 29 августа 2018

Попробуйте этот запрос: 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())))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...