尋道,而不是掃描是可能的:
SELECT *
FROM Periods
WHERE
PeriodYear BETWEEN Year(@startdate) AND Year(@enddate)
AND PeriodYear * 4 + PeriodQuarter
BETWEEN Year(@startdate) * 4 + DATEPART(Quarter, @startdate)
AND Year(@startdate) * 4 + DATEPART(Quarter, @enddate)
說明:
我從兩個組成一個新的標定整組件,年份和季度,對待每一年的組合和季度作爲一個單一的數字。
假設如果我這樣做了:
AND PeriodYear + (PeriodQuarter - 1)/4.0
BETWEEN Year(@startdate) + (DATEPART(Quarter, @startdate) - 1)/4.0
AND Year(@startdate) + (DATEPART(Quarter, @enddate) - 1)/4.0
打電話給我最初的表達「MULT」這個新的「格」,這裏有一些年,宿舍以及這些表達式將計算結果爲:
WHERE Div BETWEEN 2009.25 AND 2010.00
您:
Year Qtr Div Mult
2009 1 2009.00 8037
2009 2 2009.25 8038
2009 3 2009.50 8039
2009 4 2009.75 8040
2010 1 2010.00 8041
2010 2 2010.25 8042
2010 3 2010.50 8043
因此,如果我們運行一個WHERE對這些行第
可以看到它將如何返回正確的行。 Mult版本確實完全一樣,只是縮放年份而不是季度縮減。我使用它的原因是因爲整數數學和乘法比分數運算和除法更快。
我使用兩個條件開始的原因是爲了使查詢變得可運行。我們希望基於年份來進行搜索,如果我們將它乘以4或者對其進行其他運算,那麼這是不可能的。因此,我們首先只需將掃描結果進入正確的年份,然後對其進行微調以消除不應得到的結果。
另一種選擇是添加一個計算列並在其上放置一個索引。這不需要對代碼插入或更新進行任何更改(只要它們正確使用列列表),但可以讓您根據需要執行常規範圍數學運算。
Saajid Ismail,您是否看到我的評論如下,您選擇的答案會強制掃描?它也會佔用更多的CPU資源,因爲它必須評估整個表中每行的表達式...... – ErikE 2010-08-14 02:14:43