mysql - 选择计算多个日期注册表中两个日期之间的不同月份?

标签 mysql sql

我想获取所有注册表之间的月份计数,但是如果一年中的一个月已经被统计过,则无法再次统计。
如果该月份是来自另一年的,则可以计算.

示例:

#--|Begin date|--|End Date---|
______________________________
#--|2014-01-01|--|2014-05-01-| 01 to 05 = 5 months
#--|2014-07-01|--|2014-07-31-| 1 month
#--|2014-08-01|--|2015-01-01-| 01/2014 to 01/2015 = 6 months

示例中的总月份数:
5+1+6 == 12 个月

我如何使用 SQL 获得此计数?

最佳答案

很确定这会让你得到你想要的:

select sum(mo_between)
from(
select begin_date, end_date, case when date_format(end_date,'%e') = 1
                                  then 1 + period_diff(date_format(end_date,'%Y%m'),date_format(begin_date,'%Y%m'))
                                  when period_diff(date_format(end_date,'%Y%m'),date_format(begin_date,'%Y%m')) = 0 then 1
                                  else period_diff(date_format(end_date,'%Y%m'),date_format(begin_date,'%Y%m'))
                                  end as mo_between
from tbl) x

fiddle : http://sqlfiddle.com/#!2/953e8c/2/0

您可以运行以下命令来逐行返回它:

select begin_date, end_date, case when date_format(end_date,'%e') = 1
                                  then 1 + period_diff(date_format(end_date,'%Y%m'),date_format(begin_date,'%Y%m'))
                                  when period_diff(date_format(end_date,'%Y%m'),date_format(begin_date,'%Y%m')) = 0 then 1
                                  else period_diff(date_format(end_date,'%Y%m'),date_format(begin_date,'%Y%m'))
                                  end as mo_between
from tbl

fiddle : http://sqlfiddle.com/#!2/953e8c/1/0

这应该处理几个月之间的间隙,但是它不会处理重叠的时期,我不知道您的数据中是否存在这种情况(您的示例中不存在)。

关于mysql - 选择计算多个日期注册表中两个日期之间的不同月份?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25517233/

相关文章:

mysql获取组数据的第一行和最后一行

mysql - MariaDB/MySQL 突然崩溃并且无法重新启动

javascript - 我想要 Sequelize 形式的这个查询

MySQL,一次查询更新多个表

sql - 在 sysobjects/INFORMATION_SCHEMA 中查找 #temp 表

c# - 使用内部联接执行 SQL 更新

mysql - 在 codeigniter 中通过 URL 自动将 id 存储在后端

mysql - 错误: #1242 - Subquery returns more than 1 row in the query - MYSQL

Amazon EC2 上的 MySQL 与 SQLite

mysql - 使用 MySQL 在后台运行 SQL 查询