Подсчитайте, сколько месяцев в MySQL - PullRequest
4 голосов
/ 06 января 2012

Я создаю систему регистрации детей, и мне нужно выяснить, сколько месяцев детям. Это довольно легко, однако я хочу только извлечь детей, у которых "месячный день рождения".

Что я имею в виду под «месячным днем ​​рождения», так это если бы они родились 23 ноября, тогда 23 декабря будет их 1-месячный день рождения. 23 января исполняется 2 месяца. И так далее ...

Теперь мой код ниже говорит мне, сколько им месяцев, но не является ли это их "месяцем рождения".

Есть идеи, как мне заставить это работать?

SELECT PERIOD_DIFF( DATE_FORMAT('2011-11-23', '%Y%m'), DATE_FORMAT(birthday.meta_value, '%Y%m') ) AS months 
        FROM $db->members AS m
        JOIN $db->members_meta AS birthday ON birthday.member_id = m.id AND birthday.meta_key = 'birthday' AND birthday.meta_value != '' 
        WHERE AND m.deleted = 0
        GROUP BY m.id

Полагаю, нам нужно будет учесть, если они родятся в високосные годы (29 февраля), 30 и 31 месяца. Я нашел этот код, который работает, чтобы узнать thei

(
    2012 % 4 <> 0
    OR (
        2012 % 100 = 0
        AND 2012 % 400 <> 0
    )
)
AND '11-23' = '03-01' // 11-23 is the current month and day
AND DATE_FORMAT(birthday.meta_value, '%m-%d') = '02-29'

Ответы [ 2 ]

1 голос
/ 06 января 2012

Таким образом, чтобы определить, является ли данная дата "месяцем рождения" ребенка, нам нужно проверить, совпадает ли либо точный день месяца, либо, что день месяца рождения больше, чем последний день месяц, в котором мы запрашиваем, мы проверяем, что наша дата соответствует последнему дню месяца, в котором мы проверяем, МИНУС число дней между датой рождения и последним днем ​​месяца рождения!

Этот последний бит может показаться сумасшедшим, но я думаю, что это дает вам возможность иметь более одного "месяца рождения" в месяце, который имеет меньше дней, чем месяц вашего рождения (см. Мой второй комментарий к вопросу выше)

Я бы посмотрел что-то в этом духе, извините за синтаксис, у меня нет базы данных MySQL под рукой:

SELECT m.id
FROM $db->members AS m
JOIN $db->members_meta AS birthday ON (
    birthday.member_id = m.id AND 
    birthday.meta_key = 'birthday' AND 
    birthday.meta_value != ''
)
WHERE DAY(birthday.meta_value) = 
    CASE
        WHEN (DAY(birthday.meta_value) > DAY(LAST_DAY(CURDATE()))) THEN
            LAST_DAY(CURDATE()) - DATEDIFF(birthday.meta_value, LAST_DAY(birthday.meta_value))
        ELSE 
            DAY(CURDATE())
    END CASE

Обратите внимание, что на самом деле мне все равно, високосный год или нет.

1 голос
/ 06 января 2012

Запрос ниже завершен и протестирован.Он должен работать для вас, если вы хотите идентификаторы всех, у кого сегодня месяц bday.

Обратите внимание, что вы должны знать, является ли сегодня последний день месяца, и вы должны знать, были ли они рожденыв последний день месяца.

Если у вас есть столбец id, это должно сделать это для вас.Я проверил этот запрос, и я считаю, что он делает то, что вы хотите.Если нет, пожалуйста, оставьте комментарий, чтобы я мог лучше понять ваши требования.

SELECT `id`
FROM $db->members AS m
JOIN $db->members_meta AS birthday 
ON birthday.member_id = m.id 
AND 
birthday.meta_key = 'birthday' 
AND 
birthday.meta_value != '' 
WHERE 
(
-- If it's a match, it's a match
DATE_FORMAT(birthday.meta_value, '%d') = DATE_FORMAT('2011-11-23', '%d') 
OR 
IF
(
  -- If today is the last day of this month, we want to close out the month.
  DATEDIFF(LAST_DAY('2011-11-23'), '2011-11-23') = 0, 
  -- Match all birthdays that have a day greater than today.
  DATE_FORMAT(birthday.meta_value, '%d') > DATE_FORMAT('2011-11-23', '%d'),
  0
)
OR
)
AND 
m.deleted = 0
GROUP BY m.id
; 
...