T-SQL.Как получить строку с заданным диапазоном 2 дат, который будет сравниваться с двумя столбцами дат. - PullRequest
4 голосов
/ 13 сентября 2011

Ниже приведены данные таблицы:

CREATE TABLE #tbl_period (
    period_no INT,
    period_from SMALLDATETIME,
    period_to SMALLDATETIME
)

INSERT INTO #tbl_period (period_no, period_from, period_to)
VALUES (1, '2004-11-01 00:00:00', '2005-10-31 00:00:00')

INSERT INTO #tbl_period (period_no, period_from, period_to)
VALUES (2, '2005-11-01 00:00:00', '2006-10-31 00:00:00')

INSERT INTO #tbl_period (period_no, period_from, period_to)
VALUES (3, '2006-11-01 00:00:00', '2007-10-31 00:00:00')

INSERT INTO #tbl_period (period_no, period_from, period_to)
VALUES (4, '2007-11-01 00:00:00', '2008-10-31 00:00:00')

INSERT INTO #tbl_period (period_no, period_from, period_to)
VALUES (5, '2008-11-01 00:00:00', '2009-10-31 00:00:00')

INSERT INTO #tbl_period (period_no, period_from, period_to)
VALUES (6, '2009-11-01 00:00:00', '2010-10-31 00:00:00')

INSERT INTO #tbl_period (period_no, period_from, period_to)
VALUES (7, '2010-11-01 00:00:00', '2011-10-31 00:00:00')

SELECT * FROM #tbl_period

DROP TABLE #tbl_period

Теперь, цель состоит в том, чтобы получить period_no с двумя указанными датами, которые будут сравниваться с колонками period_from и period_to.

Example1:
date1 = '2010-11-01 00:00:00'
date2 = '2011-10-31 00:00:00'

Это вернет 7 как period_no

Example2: 
date1 = '2005-11-01 00:00:00'
date2 = '2007-10-31 00:00:00'

Он не должен возвращать period_no, поскольку указанный диапазон дат не находится в диапазоне столбцов period_from и period_to в строке. Даты перекрытия не допускаются.

Правило состоит в том, чтобы извлекать period_no, если заданная дата 2 будет соответствовать или находиться в диапазоне столбцов period_from и period_to в строке.

Как выполнить этот запрос в T-SQL?

Заранее спасибо!

1 Ответ

2 голосов
/ 13 сентября 2011

Я считаю, что это то, что вы ищете:

SELECT 
    *
FROM 
    #tbl_period 
WHERE 
    @date1 >= period_from 
    and
    @date2 <= period_to

Тесты:

declare @date1 datetime = '2010-11-01 00:00:00' 
declare @date2 datetime = '2011-10-31 00:00:00' 

SELECT * FROM #tbl_period WHERE @date1 >= period_from and @date2 <= period_to

возвращает

period_no    period_from          period_to
7            2010-11-01 00:00:00  2011-10-31 00:00:00

и

set @date1 = '2005-11-01 00:00:00' 
set @date2 = '2007-10-31 00:00:00' 

SELECT * FROM #tbl_period WHERE @date1 >= period_from and @date2 <= period_to

возвращает

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