查找月份的时间范围

时间:2013-07-21 12:07:20

标签: mysql sql datetime select

我有一个MySQL表,其中记录包含开始日期和结束日期作为时间戳。

  

id(int)| dtBeg(时间戳)| DTEND(时间戳)

我确实尝试选择在该时间范围内具有给定月份的记录。

例如:

  

id(int)| dtBeg(时间戳)| DTEND(时间戳)

     

1 | '2013-06-20'| '2013年8月20日

     

2 | '2013-07-20'| “2013年9月20日

     

2 | '2013-07-25'| '2013年7月28日'

6月发生的记录:1

7月份发生的记录:1,2,3

8月发生的记录:1,2

9月发生的记录:2

目前我不知道处理日期范围可能是一个好方法,所以我可以提取几个月。我想到的唯一解决方案是复杂的方法,我确信有一种简单而聪明的方法可以做到这一点。

1 个答案:

答案 0 :(得分:2)

对于这样的比较,我喜欢将日期时间转换为“从零开始的几个月”。你,你可以用算术来计算。

对于您的查询,这看起来像:

select t.*, year(compdate), month(compdate)
from t cross join
     (select date('2013-07-01') as compdate) const
where year(compdate)*12+month(compdate) between year(dtBeg)*12 + month(dtBeg) and
                                                year(dtEnd)*12 + month(dtEnd);

在这里,我将compdate放在子查询中。这样,如果要检查多个月,则只需向表中添加行:

select t.*, year(compdate), month(compdate)
from t cross join
     (select date('2013-07-01') as compdate union all
      select date('2013-08-01')
     ) const
where year(compdate)*12+month(compdate) between year(dtBeg)*12 + month(dtBeg) and
                                                year(dtEnd)*12 + month(dtEnd);

此表单适用于许多SQL方言。您可以使用date_format()来执行与MySQL特定功能类似的操作。

select t.*, year(compdate), month(compdate)
from t cross join
     (select '2013-07' as compdate union all
      select '2013-08'
     ) const
where compdate between date_format(dtBeg, '%Y-%m') and date_format(dtEnd, '%Y-%m)