Как сравнить два поля даты с двумя переменными даты - PullRequest
0 голосов
/ 14 июля 2009

У меня есть одна таблица как следует

ID        bigint
TaskName  nvarchar(50)
StartDate datetime      -- Start date of task
EndDate   datetime      -- End Date Of Task

Я пытаюсь написать одну процедуру, которая принимает два ввода @FromDate и @EndDate в качестве даты и времени, чтобы получить список имен задач, которые находятся между входными параметрами.

Может ли какое-либо тело помочь мне написать условие "Где" для него

Спасибо и С уважением, Rohan

Ответы [ 6 ]

4 голосов
/ 14 июля 2009
WHERE StartDate <= @EndDate AND EndDate >= @FromDate

Должен сделать трюк

Редактировать: Пример кода, который я использовал для тестирования различных сценариев:

DECLARE @Data TABLE (StartDate DATETIME, EndDate DATETIME, ID INTEGER)
INSERT @Data 
SELECT '2009-05-10','2009-05-20', 1
UNION
SELECT '2009-05-15','2009-05-20', 2
UNION 
SELECT '2009-05-01','2009-06-01', 3

DECLARE @FromDate DATETIME
DECLARE @EndDate DATETIME
SET @FromDate = '2009-05-11'
SET @EndDate = '2009-05-18'

SELECT * FROM @Data
WHERE StartDate <= @EndDate AND EndDate >= @FromDate
0 голосов
/ 14 июля 2009

ОБНОВЛЕНИЕ: После хорошей дискуссии с Адой я вижу, что его запрос является оптимальным решением. Хотя мой ответ ниже будет работать, он излишний. Я оставлю этот ответ здесь ради истории. +1 к ответу Ады.

Насколько я понимаю, он хочет получить любые задачи, над которыми работали в любой момент между указанными датами. Это подразумевает частично перекрывающиеся задачи, а также задачи, которые начались и закончились в течение интервала времени.

Два временных интервала перекрываются, если:

  • Время начала задачи 1 находится где-то между временем начала и окончания задачи 2 ИЛИ
  • Время окончания задачи 1 находится где-то между временем начала и окончания задачи 2 ИЛИ
  • Время начала и окончания

Я успешно использовал этот метод в системе бронирования, чтобы предотвратить любое совпадение при бронировании.

До сих пор в ответах я не видел запроса, который проверял бы оба эти условия. Вот моя попытка:

WHERE ( (StartDate >= @FromDate) AND (StartDate <= @EndDate) )
OR ( (EndDate >= @FromDate) AND (EndDate <= @EndDate) )
OR ( (StartDate <= @EndDate) AND (EndDate >= @StartDate) )
0 голосов
/ 14 июля 2009

Вы могли бы сделать это.

Create procedure sp_name
(@fromdate as datetime,
@Enddate as datetime
) 
as

select * from tablename
where StartDate between @FromDate and @EndDate
0 голосов
/ 14 июля 2009
WHERE (StartDate < @Fromdate ) AND ( EndDate > @EndDate )

выдаст задачи, которые были запущены раньше, чем @FromDate, но не завершены до @ EndDate.

0 голосов
/ 14 июля 2009

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

SELECT
    *
    FROM YourTable
    WHERE StartDate>=@StartDate AND EndDate<=@EndDate
0 голосов
/ 14 июля 2009

Что-то вроде следующего должно работать для вас:

select * from myTable
where StartDate > @FromDate
and EndDate < @EndDate

или что-то вроде

select * from myTable
where StartDate between @FromDate and @EndDate

Первый получает все задачи, которые находятся между датами окончания и окончания. Второй получает все задачи, которые были запущены (независимо от времени окончания) между датами начала и окончания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...