如果您的意思是要将范围与当前日期匹配,那么假设StartDate
和EndDate
aredate
类型,您可以尝试以下操作:
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()
;
但这可能会使用隐式转换,这可能会影响性能,尽管我不能确定在多大程度上,甚至更不确定你是否可以接受。同样,您需要测试和比较。一般来说,我会从一个更简单的版本开始,并记住当我对目前的表现不(或不再)满意的情况下的替代方案。