Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.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_Sql_Date - Fatal编程技术网

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

嗯,我需要得到两个值,它们只表示两个完整日期之间的距离(没有小时/时间)。。。在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
    2013-02-28
    。我有0个月零30天更多:1个月内,我需要
    2013-03-01
    ,因为
    2013-02-29
    不存在
  • 2013-03-31
    2013-04-30
    修复:我真的有0个月零30天更多:1个月内,我需要
    2013-05-01
    ,因为
    2013-04-31
    不存在
1
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天),同样的错误值也会出现。我接受了它,因为它有助于发现我的答案。我会在未来编辑它谢谢大家,真的很有用。