我在SQL Server表中有以下数据
Id Name StartDate EndDate
1 A 2/2/2012 21/2/012
2 B 3/2/2012 2/2/2014
3 C 21/2/2012 3/3/2012
4 D 1/1/2012 3/3/2012
我想获取所有符合今天日期Start Date
和End Date
的行
请帮忙。
答案 0 :(得分:3)
如果您的意思是希望将范围与当前日期匹配,那么假设StartDate
和EndDate
为date
类型,您可以尝试以下操作:
SELECT ...
FROM atable
WHERE CAST(GETDATE() AS date) BETWEEN StartDate AND EndDate
;
以上基本相同:
SELECT ...
FROM atable
WHERE StartDate <= CAST(GETDATE() AS date)
AND EndDate >= CAST(GETDATE() AS date)
;
但是如果优化器无法将其翻译为第二个版本,则第一个版本可能会产生更糟糕的查询计划。所以,如果表现至关重要,你应该先测试,然后再决定。
请注意,上述两个版本均假设EndDate
具有包容性。如果它是独占的,你可以采用第二个版本并稍微修改它:
SELECT ...
FROM atable
WHERE StartDate <= CAST(GETDATE() AS date)
AND EndDate > CAST(GETDATE() AS date)
;
你可以进一步简化它:
SELECT ...
FROM atable
WHERE StartDate <= GETDATE()
AND EndDate > GETDATE()
;
但是这可能会使用隐式转换,这可能会影响性能,虽然我不能确定在哪个范围内,甚至更少关于这是否可以接受。同样,您需要进行测试和比较。一般来说,我会从一个更简单的版本开始,并记住当我没有(或不再)对目前的表现感到满意时的替代案例。
答案 1 :(得分:1)
根据我能理解的“开始日期和结束日期与今天的日期匹配的数据”,您似乎希望得到StartDate和EndDate等于今天的所有数据。
这是查询:
SELECT *
FROM TableName
WHERE StartDate = cast(getDate() As Date) AND EndDate = cast(getDate() As Date);