【问题标题】:Find first available date, given a date range in SQL给定 SQL 中的日期范围,查找第一个可用日期
【发布时间】:2014-12-25 20:10:36
【问题描述】:

假设您有一个表格,其中包含这些日期不可用的日期范围。

+------------+------------+
| 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-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

如果有任何帮助,我将不胜感激。谢谢。

【问题讨论】:

  • 只是因为日期格式的问题,这真的是Microsoft SQL Server吗?还是 MySQL?
  • Microsoft SQL Server,我手动输入了日期。
  • @Brian - MS SQL Server 的日期格式没有问题

标签: sql sql-server date


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-28
    • 2017-12-20
    • 2011-09-27
    • 1970-01-01
    • 2010-11-20
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多