Фильтровать по нескольким диапазонам дат? - PullRequest
1 голос
/ 15 февраля 2012

Пользователь нажимает на месяц, и затем эта хранимая процедура выполняется. Он проверяет общее забронированное время и какие группы были отфильтрованы.

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

У меня есть около 12 учетных месяцев на 2012 год, которые мне нужно добавить в качестве выписок, чтобы при нажатии пользователем на март запускался правильный фильтр.

В базе данных ts.start_dtm выглядит так:

2011-04-01 00:00:00.000

Надеюсь, этого было достаточно для моего первого поста?

Я застрял в написании описания дела и где его поставить, пытался часами.

Надеюсь, вы можете помочь:)

Ответы [ 2 ]

0 голосов
/ 15 февраля 2012

Одним из вариантов будет иметь таблицу, отображающую номер ссылки месяца на дату начала и окончания, таким образом, получая эти значения и используя их в проверке ts.start_dtm. то есть это будет иметь:

Месяц-ссылка | Начало | Конец
81201 | 2011-12-28 | 2012-01-01
81202 | 2012-01-02 | 2012-01-29

и т.д.

Вы можете просто присоединиться к этой справочной таблице или поочередно получить две даты перед вашим основным запросом

0 голосов
/ 15 февраля 2012

Укажите неправильный характер ваших дат, что исключает использование дат;Я бы построил временную таблицу допустимых дат на основе запроса пользователя и присоединился бы к нему.Таблица статических целых чисел в моем приложении содержит от 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...