2014-10-29 3 views
1

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

+------------+------------+ 
| StartDate | EndDate | 
+------------+------------+ 
| 2014-10-1 | 2014-10-15 | 
+------------+------------+ 
| 2014-11-4 | 2014-11-28 | 
+------------+------------+ 
| 2014-12-17 | NULL  | 
+------------+------------+ 

EndDate of NULL означает до конца срока. Таким образом, нет доступных дат после 12/17.

Учитывая диапазон дат, мне нужно найти первую доступную дату. Я не так хорош в SQL, и я не могу придумать, как это можно сделать.

Примеры: Учитывая требуемый диапазон дат

2014-10-13 в 2014-11-17, запрос должен возвращать 2014-10-16

2014-10-13 в 2014-11 -30, запрос должен возвращать 2014-10-16

2014-10-21 в 2014-11-30, запрос должен возвращать 2014-10-21

2014-12-01 в 2015-1 -13, запрос должен быть возвращен 2014-12-01

Буду признателен за любую помощь. Благодарю.

+0

возможно дубликат [Найти ближайшие даты в SQL Server] (http://stackoverflow.com/questions/14023145/find-closest-date- in-sql-server) – Jonast92

+0

Просто вопрос из-за формата даты, это действительно Microsoft SQL Server? Или MySQL? –

+0

Microsoft SQL Server, я вручную набрал даты. – bluelunar

ответ

1

Попробуйте это, никаких петель! (BTW вашего последний тест это была неправильна, я считаю,)

CREATE TABLE [dbo].[Dates]([StartDate] [datetime] NULL, [EndDate] [datetime] NULL) ON [PRIMARY] 

INSERT INTO [dbo].[Dates]([StartDate], [EndDate]) 
SELECT '20141001 00:00:00.000', '20141015 00:00:00.000' UNION ALL 
SELECT '20141104 00:00:00.000', '20141128 00:00:00.000' UNION ALL 
SELECT '20141217 00:00:00.000', NULL 

DECLARE @Date1 DATETIME; 
DECLARE @Date2 DATETIME; 

-- Test case 1 
SET @Date1 = '2014-10-13'; 
SET @Date2 = '2014-11-17'; 

-- Test case 2 
SET @Date1 = '2014-10-13'; 
SET @Date2 = '2014-11-30'; 

-- Test case 3 
SET @Date1 = '2014-10-21'; 
SET @Date2 = '2014-11-30'; 

-- Test case 4 
SET @Date1 = '2014-12-01'; 
SET @Date2 = '2015-01-13'; 

-- Generate a temp table of dates from @Date1 to @Date2 
SELECT TOP (DATEDIFF(DAY, @Date1, @Date2)+1) 
    [date] = DATEADD(day, ROW_NUMBER() OVER (ORDER BY [object_id]) - 1, @Date1) 
INTO 
    #DateRange 
FROM 
    sys.all_objects 

-- Remove non-available dates 
DELETE #DateRange 
WHERE 
    EXISTS(SELECT 1 FROM dbo.Dates WHERE date BETWEEN StartDate AND ISNULL(EndDate, date)) 

-- Select first available date 
SELECT TOP 1 * FROM #DateRange AS dr ORDER BY date 
Смежные вопросы