查找第一个可用日期,给定SQL日期范围

问题描述:

假设您有一个包含日期范围的表,但这些日期不可用。查找第一个可用日期,给定SQL日期范围

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

NULL的EndDate意味着直到时间结束。所以12/17之后没有可用的日期。

给定日期范围,我需要找到第一个可用日期。我在SQL方面并不擅长,我想不出如何做到这一点。

例子: 鉴于所需的日期范围

2014年10月13日到情节中字,查询应该返回二○一四年十月一十六日

2014年10月13日至2014-11 -30,查询应返回2014年10月16日

2014年10月21日到情节中字,查询应返回2014年10月21日

2014年12月1日至2015-1 -13,查询应该会返回2014-12-01

我很感激任何帮助。谢谢。

+0

可能重复[查看SQL Server中最接近的日期(http://stackoverflow.com/questions/14023145/find-closest-date- in-sql-server) – Jonast92 2014-10-29 22:46:20

+0

只是因为日期格式的问题,这真的是Microsoft SQL Server吗?还是MySQL? – 2014-10-29 23:06:56

+0

Microsoft SQL Server,我手动输入日期。 – bluelunar 2014-10-30 00:12:24

试试这个,没有循环! (顺便说一句你的最后一次测试案例是错误的,我相信)的

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