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