当我们尝试从两个日期之间的表中选择记录时,我们遇到了问题。
表结构/数据类型:
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
我们没有得到其他三行。我做错了什么?
答案 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().
它将返回所有行。