Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算MySQL中有多少个月的历史_Mysql_Date Arithmetic - Fatal编程技术网

计算MySQL中有多少个月的历史

计算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

我正在创建一个儿童登记系统,我需要计算出儿童有多少个月大。这是很容易,但我只想提取谁的“月生日”是谁的孩子

我所说的“月生日”是指如果他们出生在11月23日,那么12月23日就是他们1个月大的生日。1月23日是他们两个月大的生日。等等

现在,我下面的代码告诉我他们有多少个月大,但不知道这是否是他们的“月生日”

你知道我该怎么做吗

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.谢谢你坚持这种唠叨的感觉。汤姆,我想可能就是这样!