1

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

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

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

例如:

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

1 | '2013-06-20' | '2013-08-20'

2 | '2013-07-20' | '2013-09-20'

2 | '2013-07-25' | '2013-07-28'

6月发生的记录:1

七月发生的记录:1、2、3

八月发生的记录:1、2

九月发生的记录:2

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

4

1 回答 1

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().

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)
于 2013-07-21T12:15:48.207 回答