我正在使用CTE生成一組日期。計算日期之間的行
12/02/2010 10:00:00 12/02/2010 10:59:59
12/02/2010 11:00:00 12/02/2010 11:59:59
12/02/2010 12:00:00 12/02/2010 12:59:59
然後我將它加入包含大量日期的索引視圖。
我有2個選項的時間之間的計數範圍
1),我將SUM(情況)測試LOG_DATE以測試是否它是開始和結束日期之間,+ 1代表真,0代表假 - 所以如果沒有結果我總是會得到'0'
12/02/2010 10:00:00 12/02/2010 10:59:59 0
12/02/2010 11:00:00 12/02/2010 11:59:59 1
12/02/2010 12:00:00 12/02/2010 12:59:59 0
2)我可以使用每個日期範圍的WHERE子句計數(*)。
12/02/2010 11:00:00 12/02/2010 11:59:59 1
正如你所期望1)是有效的,但對性能有巨大的開銷2)可能是8000%比較有效,但無法返回返回指定日期範圍之間的空結果應該過濾器適用範圍。
有沒有辦法使用高效的WHERE子句,但保留日期範圍的行詳細'0'?
這裏是的情況下解決一些SQL:
SELECT [LABEL], [Display Start Date], [Display End Date],
SUM(CASE WHEN ([LOG].line_date BETWEEN [Start Date] AND [End Date]) THEN 1 ELSE 0 END) AS [Total Calls],
SUM(CASE WHEN ([LOG].line_date BETWEEN [Start Date] AND [End Date]) AND ([LOG].line_result = 1) THEN 1 ELSE 0 END) AS [1 Calls],
FROM [DATE RANGE FUNCTION] LEFT JOIN
dbo.vCallLog WITH (noexpand) as [LOG] on 0 > -1
GROUP BY [Start Date], [End Date], [Display Start Date], [Display End Date], [LABEL]
這裏是在WHERE解決方案的一些SQL:
SELECT [LABEL], [Display Start Date], [Display End Date],
COUNT(dbo.vCallLog.line_id) AS [Total Calls],
SUM(CASE WHEN ([LOG].line_result = 1) THEN 1 ELSE 0 END) AS [1 Calls],
FROM [DATE RANGE FUNCTION] LEFT JOIN
dbo.vCallLog WITH (noexpand) as [LOG] on 0> -1
WHERE ([LOG].line_date BETWEEN [Start Date] AND [End Date])
GROUP BY [Start Date], [End Date], [Display Start Date], [Display End Date], [LABEL]
不幸的是,它仍然忽略沒有匹配行的範圍。 –
您是否嘗試運行該示例,我添加了測試用例的輸出 –
yes是該示例按預期工作,因此當類似的概念表(1帶有日期範圍,另一個日期列表......本質上)出現混淆時複製我一直期望的左連接。事實上,它包含我的'日期行'的索引視圖是一個因素? –