用户点击一个月,然后执行此存储过程。它会检查总预订时间以及已过滤的组。
| 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
希望这是我第一篇文章的足够信息吗?
我很难写出案例陈述以及放置它的地方,现在已经尝试了几个小时。
希望你能提供帮助:)
答案 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
等
您可以加入此参考表,或者在主查询之前检索两个日期