根据多个日期范围过滤?

时间:2012-02-15 13:56:54

标签: sql sql-server-2008 tsql case

用户点击一个月,然后执行此存储过程。它会检查总预订时间以及已过滤的组。

 | Job Group | Month Booked | Time (hrs) |
   Cleaning        Jan            7

我有以下SQL:

SELECT 
    tsks.grouping_ref, ttg.description AS grouping_desc, 
    SUM(ts.booked_time) AS booked_time_total, 
    DATENAME(MONTH, ts.start_dtm) + ' ' + DATENAME(YEAR, ts.start_dtm) AS month_name,
    @month_ref AS month_ref
FROM 
    timesheets ts
JOIN  
    timesheet_categories cat ON ts.timesheet_cat_ref = cat.timesheet_cat_ref
JOIN 
    timesheet_tasks tsks ON ts.task_ref = tsks.task_ref
JOIN 
    timesheet_task_groupings ttg ON tsks.grouping_ref = ttg.grouping_ref
WHERE 
    ts.status IN(1, 2) --Booked and approved
    AND cat.is_leave_category = 0 --Ignore leave
    AND DATEPART(YEAR, ts.start_dtm) = @Year
    AND DATEPART(MONTH, ts.start_dtm) = @Month
GROUP BY 
    tsks.grouping_ref, ttg.description,
    DATENAME(MONTH, ts.start_dtm),
    DATENAME(YEAR, ts.start_dtm)
ORDER BY 
    grouping_desc

我想根据多个日期范围进行过滤。

我想添加这个:

AND ((ts.start_dtm BETWEEN '2011-12-28' AND '2012-01-01')
OR (ts.start_dtm BETWEEN '2012-01-02' AND '2012-01-29'))

但后来意识到用户点击它的月份无关紧要仍然会显示所有记录,因为它会执行OR语句。

我需要的是基于month_ref的东西,例如:

CASE WHEN @month_ref = 81201 THEN 
AND (ts.start_dtm BETWEEN '2011-12-28' AND '2012-01-01')
END

但case语句需要在WHERE子句之后。

2012年我有大约12个会计月份,我需要将其作为案例陈述添加,以便当用户点击3月时,它将触发正确的过滤器。

在数据库中ts.start_dtm看起来像这样:

2011-04-01 00:00:00.000

希望这是我第一篇文章的足够信息吗?

我很难写出案例陈述以及放置它的地方,现在已经尝试了几个小时。

希望你能提供帮助:)

2 个答案:

答案 0 :(得分:0)

使用dateparts可以排除日期的不规则性;我将根据用户查询构建一个允许日期的临时表并加入它。我的应用程序中的静态整数表有1到64000,您的表可能会有所不同。

DECLARE 
    @startdate DateTime  = '2012-05-01',
    @EndDate DateTime = '2012-06-03'

DECLARE
    @AllDates TABLE (MyDate DateTime)

INSERT INTO @AllDates
SELECT 
    DATEADD(dd, StaticInteger, @startdate)
FROM dbo.tblStaticIntegers
WHERE StaticInteger <= DATEDIFF(dd, @startdate, @EndDate)

答案 1 :(得分:0)

一个选项是将一个表格映射月份参考编号到开始和结束日期,从而检索这些值并在ts.start_dtm检查中使用它们。即它会:

Month-ref |开始|结束
81201 | 2011-12-28 | 2012-01-01
81202 | 2012-01-02 | 2012-01-29

您可以加入此参考表,或者在主查询之前检索两个日期