2012-01-06 3 views
4

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

Что я подразумеваю под «днем рождения», если они родились 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' 
+1

Итак, если бы я был «прыгающим младенцем» и родился 28 февраля, какой будет мой первый «день рождения»? – ninesided

+0

28-е число каждого месяца будет их «месяцем рождения». То же самое с 29-м. Если они родились 30 или 31, то это будет какой бы ни был последний день месяца. Так что в феврале дело было бы 28 или 29. –

+1

Последний последний случай - если я родился 30 декабря (т. Е. Не последний день месяца), какой будет мой «месяц рождения» в феврале? Должен ли я вычитать один день с последнего дня в феврале? – ninesided

ответ

1

Вопрос ниже заполнен и протестирован. Он должен работать для вас, если вы хотите видеть всех тех, у кого есть месяц 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 
; 
+0

вы близки, но на основании вышеизложенного, если бы я родился 30 декабря, в феврале не было бы дня, который был бы моим «днем рождения». – ninesided

+0

Прочитайте второй набор круглых скобок в предложении WHERE. Если вы родились 30-го числа, 29 февраля (равный последнему февралю) будет соответствовать вашему дню (больше 29). Вы действительно запустили этот SQL? Я тестировал его, и я считаю, что он работает. –

+0

Я не тестировал его, просто заметил его, извинился, если я неправильно понял это, но если то, что вы говорите, имеет место, если мой день рождения - это 30-е, это не означает, что каждый день в феврале считается действительным матч, так как ни один день в феврале больше 30? – ninesided

1

Так, чтобы определить, является ли данная дата ребенка «месяц рождения» мы должны проверить, что либо день месяца точно соответствует, или, что если в день рождения месяца больше, чем в последний день месяца, который мы запрашиваем, мы проверяем, соответствует ли наша дата последнему дню месяца, в котором мы проверяем, MINUS количество дней между датой рождения и последним днем ​​месяца рождения!

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

Я бы искать что-то вдоль этих линий, извините синтаксис, у меня нет базы данных 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 

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