计算MySQL中有多少个月的历史
我正在创建一个儿童登记系统,我需要计算出儿童有多少个月大。这是很容易,但我只想提取谁的“月生日”是谁的孩子 我所说的“月生日”是指如果他们出生在11月23日,那么12月23日就是他们1个月大的生日。1月23日是他们两个月大的生日。等等 现在,我下面的代码告诉我他们有多少个月大,但不知道这是否是他们的“月生日” 你知道我该怎么做吗计算MySQL中有多少个月的历史,mysql,date-arithmetic,Mysql,Date Arithmetic,我正在创建一个儿童登记系统,我需要计算出儿童有多少个月大。这是很容易,但我只想提取谁的“月生日”是谁的孩子 我所说的“月生日”是指如果他们出生在11月23日,那么12月23日就是他们1个月大的生日。1月23日是他们两个月大的生日。等等 现在,我下面的代码告诉我他们有多少个月大,但不知道这是否是他们的“月生日” 你知道我该怎么做吗 SELECT PERIOD_DIFF( DATE_FORMAT('2011-11-23', '%Y%m'), DATE_FORMAT(birthday.meta_val
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个月。我发现这段代码适用于find out 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'
(
2012 % 4 0
或(
2012 % 100 = 0
2012年为400%
)
)
并且'11-23'='03-01'//11-23是当前的月份和日期
日期格式(birth.meta_值,%m-%d')='02-29'
下面的查询已完成并经过测试。如果你想要所有今天有一个月工作日的人的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
;
因此,为了确定某个日期是否是孩子的“月生日”,我们需要检查该月的日期是否完全匹配,或者如果出生月份的日期大于我们要查询的月份的最后一天,我们需要检查我们的日期是否匹配我们要检查的月份的最后一天,减去出生日期和出生月份最后一天之间的天数 这最后一点可能听起来很疯狂,但我认为它让你在一个比你出生月份天数少的月份里有一个以上的“月生日”(见我对上述问题的第二点评论) 我会沿着这些思路看一些东西,请原谅语法,我手头没有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
请注意,我实际上并不在乎这是否是闰年。因此,如果我是一个“闰年婴儿”,出生在2月28日,我的第一个“月生日”是什么日期?每个月的28日是他们的“月生日”。第29届也一样。如果他们出生在30日或31日,那么这将是一个月的最后一天。所以在二月的情况下是28号或29号。最后一个角落的情况是——如果我出生在12月30日(即不是一个月的最后一天),我二月的“一个月生日”是什么?我应该从2月的最后一天减去一天吗?你很接近了,但是基于以上,如果我出生在12月30日,那么2月就没有一天是我的“月生日”1.我认为最困难的情况是,你的生日不是一个月的最后一天,但这一天大于你要检查的月份的天数。你在这个问题上是正确的。最后一个,我保证:b'day=2月29日,3月30日和31日不都会触发案例3吗?p.s.谢谢你坚持这种唠叨的感觉。汤姆,我想可能就是这样!