在MySQL中计算月龄

4
我正在创建一个儿童签到系统,需要计算儿童的年龄。这很容易,但我只想提取“月生日”的儿童。
所谓“月生日”,是指如果他们出生于11月23日,则12月23日将是他们1个月大的生日。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

我想我们需要考虑他们是否在闰年(2月29日),以及每个月的30日和31日出生。我找到了这段代码,可以用来查找他们的

(
    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
如果我是一个“闰年宝宝”,出生在2月28日,那么我的第一个“月生日”是哪一天? - ninesided
每个月的28日将是他们的“月生日”。29日也一样。如果他们出生在30日或31日,则为该月的最后一天。因此,在二月的情况下,它将是28日或29日。 - Ben Sinclair
1
最后一个特殊情况 - 如果我的生日是12月30日(即不是该月的最后一天),那么在2月份我应该过几岁生日?我是否应该从2月的最后一天减去一天? - ninesided
2个回答

1
以下查询已经完整测试。如果您想要获取今天生日的所有人的ID,它应该可以为您工作。
请注意,您必须知道今天是否是本月的最后一天,并且您必须知道他们是否在本月的最后一天出生。
假设您有一个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
; 

你很接近了,但根据上面的内容,如果我出生在12月30日,那么二月份就没有哪一天是我的“月生日”。 - ninesided
1
我认为最困难的情况是,当你的生日不是月底而是在检查的月份的天数之后时。 - ninesided
1
你在那个案例上是正确的。最后一个,我保证:b'day = 2月29日,3月30日和31日都会触发第三种情况吗? - ninesided
1
感谢您坚持追踪那个令人烦恼的感觉。 - Tom Haws
1
汤姆,我想那可能就是它了! - ninesided
显示剩余5条评论

1

因此,要确定给定日期是否是孩子的“月生日”,我们需要检查月份的日期是否完全匹配,或者如果出生月份的日期大于我们查询的月份的最后一天,则检查我们的日期是否与我们正在检查的月份的最后一天匹配,减去出生日期和出生月份最后一天之间的天数!

这最后一部分可能听起来很疯狂,但我认为它可以避免在比您的出生月份少天的月份中拥有多个“月生日”的可能性(请参见上面问题的第二条评论)。

我会寻找类似以下内容的东西,抱歉语法不正确,我没有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

请注意,我实际上并不关心这是否是闰年。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接