2012-02-15 76 views
1

用户点击一个月,然后执行该存储过程。它会检查总预订时间和哪些组已被过滤。基于多个日期范围进行筛选?

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

但后来意识到它不会有问题,用户点击何年何月它仍然会显示,因为它会进行或声明的所有记录。

我需要什么样的东西,是基于该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月的会计,我需要添加为case语句,这样,当用户点击三月,它会触发正确的过滤器。

在数据库ts.start_dtm看起来是这样的:

2011-04-01 00:00:00.000 

希望那是足够的信息,我的第一篇文章?

我坚持写case语句,并把它放在哪里,现在一直在努力了几个小时。

希望你能帮助:)

回答

0

给你的日期将排除使用日期部分的不规则性质;我会根据用户查询建立一个允许日期的临时表并加入。在我的应用程序中的静态整数表有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) 
+0

感谢这个,所以你的代码片段在我的数据库创建临时表? – 2012-02-15 14:28:40

+0

该示例使用临时表来存储查询将运行的日期与yes。您将需要创建一个整数的永久表,让插入语句工作(假设你不已经有一个) – u07ch 2012-02-16 11:13:57

+0

我的存储过程似乎是在管理工作室,但该网站似乎并不喜欢之间date工作。任何想法为什么? – 2012-02-22 15:58:44

0

一种选择是有一个表映射月份参考号码的开始和结束日期因而检索这些值,并在您检查ts.start_dtm使用它们。即它会有:

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

您可以直接加入到这个参考表或可替代的主查询检索前两个日期