Фильтрация строк SQL - PullRequest
       6

Фильтрация строк SQL

3 голосов
/ 02 февраля 2010

Схема таблицы

ID     Activate_Date                InActivate_Date
1      2009-12-18 10:25:19.470  2010-01-13 08:32:30.130
2      2009-12-18 10:25:19.470  2010-01-13 08:32:30.253
3      2009-12-18 10:25:19.470  2010-01-13 08:32:30.363
4      2009-12-18 10:25:19.470  2010-01-13 08:32:30.583
5      2009-12-18 10:25:19.470  2010-01-13 08:32:30.473
6      2010-01-13 14:46:53.880  2010-01-13 14:50:45.443
7      2010-01-13 08:32:30.600  2010-01-13 14:46:23.833
8      2010-01-13 08:32:30.600  2010-01-13 14:46:23.833
9      2010-01-13 08:32:30.600  2010-01-13 14:46:23.833
10     2010-01-13 08:32:30.600  2010-01-13 14:46:23.833
11     2010-01-13 14:46:53.880  2010-01-13 14:50:45.443
12     2010-01-13 14:44:56.397  2010-01-13 14:46:23.833
13     2010-01-13 12:42:59.113  2010-01-13 14:46:23.833
14     2010-01-13 12:42:59.113  2010-01-13 14:46:23.833
15     2010-01-13 12:42:59.113  2010-01-13 14:46:23.833
16     2010-01-13 12:42:59.113  2010-01-13 14:46:23.833

Входные параметры:

Declare @StartDate DateTime
Declare @EndDate DateTime

Declare @FirstShiftStartTime varchar(8)
Declare @FirstShiftEndTime varchar(8)

Set @StartDate = '1/01/2010'
Set @EndDate = '1/03/2010'

SET @FirstShiftStartTime = '15:00:00'
SET @FirstShiftEndTime = '17:00:00'

Выход:

Выходными данными должны быть все строки, чтобы фильтр времени применялся к каждому дню в форме смены. Так что, если мы используем эти параметры, то выход должен сначала 5 строк от ID 1 до 5.

Так в выходном фильтре следует применять как:

1/01/2010 from 15:00:00 to 17:00:00
2/02/2010 from 15:00:00 to 17:00:00
3/03/2010 from 15:00:00 to 17:00:00

Надеюсь, я ясно дал понять:

Я пытался использовать:

((DatePart(Table.Activate_Date) <= @StartDate AND DatePart(Table.INActivate_Date) > @StartDate) OR
     (DatePart(Table.Activate_Date) >= @StartDate AND DatePart(Table.InActivate_Date) < @EndDate)
    )

AND ((TimePart(Table.Activate_Date) >=@FirstShiftStartTime ) AND (TimePart(Table.INActivate_Date) < @FirstShiftEndTime))

Но это не будет работать, если дата активации и дата инактивации охватывают несколько дней.

Другой способ, который я мог бы найти, - это создать временную таблицу с циклами каждый день, а затем заполнить временную таблицу фильтрами и затем применить вышеописанный метод.

Я надеюсь, что должно быть что-то простое, тогда я думаю.

Любая помощь будет высоко оценена.

Ответы [ 2 ]

0 голосов
/ 04 февраля 2010

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

Обновление: для простой проверки диапазона дат используйте:

dr1.EndDate> = dr2.StartDate и dr1.StartDate <= dr2.EndDate </p>

0 голосов
/ 02 февраля 2010

Не думаю, что вы можете рассматривать дату и время отдельно. Если вы хотите узнать, что было активным между 1500 и 1700 годами 02.02.2010, и строка имеет Активную дату 01/01 и Неактивную дату 03/03, то она была активна весь день 02 / 02, поэтому время начала / окончания в БД не имеет значения.

Если активная или неактивная дата наступает в указанную дату (02/02) , тогда вам необходимо учитывать время.

Я думаю, вы хотите что-то вроде этого псевдокода:

   (ActivateDate < @StartDate OR ( 
        ActivateDate = @StartDate And ActivateTime <= @ShiftStartTime )
    )
and (InActivateDate > @EndDate OR ( 
        InActivateDate = @EndDate And InActivateTime >= @ShiftEndTime )
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...