Mysql 仅限两个完整日期之间的月份距离
嗯,我需要得到两个值,它们只表示两个完整日期之间的距离(没有小时/时间)。。。在MySQL上,我们有Mysql 仅限两个完整日期之间的月份距离,mysql,sql,date,Mysql,Sql,Date,嗯,我需要得到两个值,它们只表示两个完整日期之间的距离(没有小时/时间)。。。在MySQL上,我们有PERIOD\u DIFF来获取两个日期之间的差异(只有月份和年份),但我也需要包括日期 我有两次约会,比如: 2011-12-05和2012-01-10。在2012-01-05之后,我有一个完整的月,还有5天 2012-01-01和2012-03-01。我有两个月零天 2012-02-29和2012-03-28。我有0个月零28天更多:一个月内,我需要2012-03-29 2013-01-29
PERIOD\u DIFF
来获取两个日期之间的差异(只有月份和年份),但我也需要包括日期
我有两次约会,比如:
和2011-12-05
。在2012-01-10
之后,我有一个完整的月,还有5天2012-01-05
和2012-01-01
。我有两个月零天2012-03-01
和2012-02-29
。我有0个月零28天更多:一个月内,我需要2012-03-28
2012-03-29
和2013-01-29
。我有0个月零30天更多:1个月内,我需要2013-02-28
,因为2013-03-01
不存在2013-02-29
和2013-03-31
修复:我真的有0个月零30天更多:1个月内,我需要2013-04-30
,因为2013-05-01
不存在2013-04-31
2012
是闰年/bissexto²
2013
不是
我不知道我需要做什么来解决这个问题。将月内总差异的一些变量设置为0 使用
DATEDIFF
获取开始日期和结束日期之间的总天数差异
对于开始月和结束月之间的每个月(如果在这两个月之间有任何月份),使用LAST_DAY
和DATEDIFF
计算该月的天数
从天数的总差异中减去该月的天数,然后在月份的总差异中添加1,尝试以下方法:
SET @start = '2013-03-31';
SET @end = '2013-04-30';
-- date @start is last day of month ?
SET @start_last = @start = LAST_DAY(@start);
-- date @end is last day of month ?
SET @end_last = @end = LAST_DAY(@end);
-- checking if difference is more than month
SET @month_or_more =IF(@start_last AND @end_last OR DAY(@start) = DAY(@end), DATE_ADD(@start, INTERVAL 1 MONTH) <= @end, DATE_ADD(@start, INTERVAL 1 MONTH) < @end);
-- diff in months
SET @m_num = IF(@month_or_more, PERIOD_DIFF( DATE_FORMAT(@end, '%Y%m'), DATE_FORMAT(@start, '%Y%m')), 0);
-- diff in days
SET @d_num = DATEDIFF(DATE_ADD(@start, INTERVAL @m_num MONTH), @end);
SELECT ABS(@m_num) as month, ABS(@d_num) as days;
SET@start='2013-03-31';
设置@end='2013-04-30';
--开始日期是月的最后一天吗?
设置@start\u last=@start=last\u DAY(@start);
--date@end是一个月的最后一天吗?
设置@end_last=@end=last_DAY(@end);
--检查差异是否超过一个月
设置@month\u或@end\u more=IF(@start\u last和@end\u last或DAY(@start)=DAY(@end),DATE\u ADD(@start,INTERVAL 1 month)在您使用PERIOD\u DIFF
获得月数后,您可以将其添加到较小的日期,然后减去以获得天数:-)我是不是遗漏了什么,或者是因为从一个月的最后一天到下个月的最后一天是一个月,所以我正好错过了一个月?我更喜欢@zerkms的解决方案,而不是给出的任何答案:-)@piotrekkr:不知什么原因OP想要2013-03-31-2013-04-30
=2013-03-30-2013-04-30
=1个月
:-S@BRPocock他的方法不适用于2013-01-29和2013-02-28
,因为PERIOD_DIFF会说相差1个月,然后你在2013-01-29
中加上1个月,你就有了2013-02-28
。减去后,天数将为0<代码>1个月0天
不正确。对于2012-02-29和2012-03-28(1个月-1天),同样的错误值也会出现。我接受了它,因为它有助于发现我的答案。我会在未来编辑它谢谢大家,真的很有用。