在sql中选择两个日期之间

时间:2017-02-17 08:50:21

标签: sql

当我们尝试从两个日期之间的表中选择记录时,我们遇到了问题。

表结构/数据类型:

    Slno (int, notnull, IsIdentity(yes))  
    Name (string(50))
    StartDate (datetime)
    EndDate (datetime)

示例数据:

Slno    Name      StartDate                   EndDate
 1      ABC       2017-02-17 00:00:00.000     2017-02-25 00:00:00.000
 2      ABD       2017-02-15 00:00:00.000     2017-02-25 00:00:00.000
 3      ABD       2017-02-17 00:00:00.000     2017-02-17 00:00:00.000
 4      ABD       2017-02-14 00:00:00.000     2017-02-18 00:00:00.000
 5      ABD       2017-02-17 00:00:00.000     2017-02-20 00:00:00.000

我们尝试运行以下sql查询:

select * from dbo.XYZ where (getdate() between StartDate and EndDate)

输出结果为:

Slno    Name      StartDate                   EndDate
 1      ABC       2017-02-17                  2017-02-25
 2      ABD       2017-02-17                  2017-02-20

我们没有得到其他三行。我做错了什么?

3 个答案:

答案 0 :(得分:0)

SELECT *
FROM dbo.Table
WHERE EndDate >= GETDATE()
  AND StartDate < DATEADD(DAY, 1, GETDATE());

这将尽可能使用您定义的索引。

有关详情,请参阅bad habits to kick mishandling date range queries (Aaron Bertrand)

答案 1 :(得分:0)

试试这个,但正如Todd所说,如果数据类型是datetime,为什么时间不包含在输出中?

SELECT * 
FROM dbo.XYZ 
WHERE StartDate <= GETDATE() 
    AND EndDate >= GETDATE()

编辑: 看起来您正在存储日期,而不是日期时间,请尝试以下内容:

SELECT * 
FROM dbo.XYZ 
WHERE StartDate <= CAST(GETDATE() AS DATE) 
    AND EndDate >= CAST(GETDATE() AS DATE)

编辑: 不确定我还能提供什么帮助,你是在SQL Server,Oracle等吗?下面的脚本将向您展示日期和日期时间数据类型的外观(SQL Server),这就是让您感到困惑的原因,因为您声称数据类型是datetime但输出看起来像date。

SELECT 
cast(GETDATE() as datetime),
cast(GETDATE() as date) 

答案 2 :(得分:-1)

Getdate()表示当前日期和时间。所以上面的查询返回2行。

您可以参考此查询:

declare @minDate datetime
declare @maxDate datetime

select @minDate = MIN(StartDate) from dbo.XYZ
select @maxDate = MAX(EndDate) from dbo.XYZ

    select * from dbo.XYZ where @minDate<= GetDate() OR @maxDate >= GetDate().

它将返回所有行。