【问题标题】:Month distance between two full dates-only仅两个完整日期之间的月份距离
【发布时间】:2011-12-21 19:17:44
【问题描述】:

好吧,我需要两个值来表示两个完整日期之间的距离(无小时/时间)...在 MySQL 上,我们有 PERIOD_DIFF 可以获取两个日期之间的差异(只有月份和年份),但我也需要包括这一天。

我有两个日期,例如:

  • 2011-12-052012-01-10。在2012-01-05 之后,我还有整整一个月,还有 5 天。
  • 2012-01-012012-03-01。我有 2 个月零 0 天。
  • 2012-02-292012-03-28¹。我有 0 个月零 28 天。 更多:1个月,我需要2012-03-29
  • 2013-01-292013-02-28²。我有 0 个月和 30 天。 更多:1个月内,我需要2013-03-01,因为2013-02-29不存在。
  • 2013-03-312013-04-30修复真的我有 0 个月零 30 天。 更多:1个月内,我需要2013-05-01,因为2013-04-31不存在。

¹2012 是闰年 / bissexto;
²2013不是;

我不知道我需要做什么来解决这个问题。

【问题讨论】:

  • 在获得monthsPERIOD_DIFF 的数量后,您可以将其添加到较小的日期,然后减去以获得天数:-)
  • 我错过了什么或2013-03-312013-04-30 我正好是1个月的时间,因为一个月的最后一天和下个月的最后一天之间的时间是一个月?
  • 我喜欢@zerkms 的解决方案胜过任何给出的答案:-)
  • @piotrekkr:出于某种未知原因,OP 想要 2013-03-31 - 2013-04-30 = 2013-03-30 - 2013-04-30 = 1 Month :-S
  • @BRPocock 他的方法不适用于2013-01-29 and 2013-02-28,因为 PERIOD_DIFF 会说相差 1 个月,然后您将 1 个月添加到 2013-01-29 并且您有 2013-02-28。减法后的天数将为 0。1 month 0 days 不正确。 2012-02-29 and 2012-03-28(1 个月 -1 天)的相同值不正确

标签: mysql sql date


【解决方案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;

// 编辑固定版本

【讨论】:

    【解决方案2】:

    月份总差的一些变量设置为 0。

    使用DATEDIFF 获取开始日期和结束日期之间的总天数

    对于每个介于您的开始和结束月份(如果中间有月份),请使用LAST_DAYDATEDIFF 来计算该月的天数

    总天数中减去该月的天数,然后总天数差加1个月

    【讨论】:

    • 我接受了它,因为它有助于发现我的答案。我会在未来编辑它。 ;) 谢谢大家,真的很有用。
    猜你喜欢
    • 2021-04-05
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 2012-12-24
    相关资源
    最近更新 更多