SQL Server:获取日期在特定时间内的记录fram

时间:2016-01-29 11:36:08

标签: sql sql-server tsql date

假设我有下表

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

感谢任何帮助

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