假设我有下表
EventName | eventStartDate | eventEndDate
--------------------------------------------------
Event 1 | 11/11/2015 | 01/31/2016
Event 2 | 01/24/2016 | 01/26/2016
Event 3 | 02/23/2015 | 03/20/2016
Event 4 | 02/20/2016 | 02/26/2016
我想编写查询,以获取事件发生在一个日历月内的所有事件。例如,我希望获得1月份活动的所有活动。这将留给我事件1,事件2和事件3
感谢任何帮助
答案 0 :(得分:3)
这可以使用一系列条件来完成:
select *
from your_table
where
(eventStartDate >= '20160101' and eventStartDate <= '20160131')
or
(eventEndDate >= '20160101' and eventEndDate <= '20160131')
or
(eventStartDate <= '20160101' and eventEndDate >= '20160131')
第一个定义从1月开始的时期。
第二个定义了在1月结束的perion。
第三个定义在Jan之前和之后开始的时间段(包括)。
显然 - 没有其他时期与这个特定的一月相交。
<强>更新强>
所有这些条件都可以简化为:
select *
from your_table
where eventStartDate <= '20160131' and eventEndDate >= '20160101'
这种情况仍然定义了上述所有三个时期,但明显更短。
答案 1 :(得分:1)
另一种方法是计算每个月的六位数字,然后使用BETWEEN
运算符:
SELECT
[EventName]
, [eventStartDate]
, [eventEndDate]
FROM [tblEvents]
WHERE 201601 BETWEEN YEAR([eventStartDate]) * 100 + MONTH([eventStartDate]) AND YEAR([eventEndDate]) * 100 + MONTH([eventEndDate])
更新但是,对于庞大的数据集,将会有大量的计算工作,因此必须牢记性能。
答案 2 :(得分:0)
DECLARE
@CurrentMonth int =1 -- MONTH IN NUMBERS
Please this
SELECT *
EventName
,eventStartDate
,eventEndDate
FROM EVENTs
WHERE
YEAR(eventStartDate) =YEAR(GETUTCDATE())
AND (MONTH(eventStartDate)>= @CurrentMonth AND MONTH(eventStartDate)<(@CurrentMonth+1))