2013-01-21 40 views
1

我有一個視圖,它包含2012年至2012年的銷售數據,我需要編寫僅顯示當年銷售額(2013年)的查詢。SQL 2005獲取本年度數據

這是我在第一階段試圖

SELECT * 
FROM [Sales_Data] 
WHERE invoiceDate between '2013-01-01' and '2013-12-31' 

此查詢需要2秒加載數據,我雖然更改查詢來獲取數據,不需要我來手動更新它,這是我在網上發現:

select * from [Sales_Data] 
where datepart(yyyy,invoiceDate) =datepart(yyyy,getdate()) 
and datepart(yyyy,invoiceDate) =datepart(yyyy,getdate()) 

由於此查詢需要更長的時間來顯示數據(9秒)的結果。 請讓我知道是否有更好的查詢來在更短的時間內定義和獲取數據?

+0

您的第二個查詢在絕對沒有理由的情況下在'WHERE'子句中重複相同的條件。它可以縮短爲'SELECT * FROM [Sales_Data] WHERE DatePart(yyyy,invoiceDate)= DatePart(yyyy,GetDate())' –

回答

2

您的第二個查詢需要sql服務器爲您查詢的每一行執行計算。

以下查詢更符合您的原始選擇語句。

select * from [Sales_data] 
where invoiceDate between DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()), 0) --- First Day of current year 
and DATEADD(MILLISECOND, -3,DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()) + 1, 0)) --- Last Day of current year 

根據您查詢的視圖進行的操作,您還可以從包含invoiceDate字段的索引獲益。

您可能想要檢查運行查詢時生成的執行計劃,以查看查詢運行時幕後發生的情況。

+0

我的朋友,你的查詢需要41秒鐘執行:)請讓我知道如何添加索引。謝謝 – user1820065

+0

您可能還有別的事情正在進行,因爲我的查詢應該只比第一個查詢長几毫秒,因爲唯一真正的區別就是它正在計算between語句的開始日期和結束日期。如果你從'...中選擇count(*)而不是'select * from ...',它們是如何執行的?爲了在Sql 2005中創建索引,在代碼項目上有一個很好的方法:[http://www.codeproject.com/Articles/39006/Overview-of-SQL-Server-2005-2008-Table-Indexing-Pa]( http://www.codeproject.com/Articles/39006/Overview-of-SQL-Server-2005-2008-Table-Indexing-Pa) –

+0

我看不到任何問題,我在不同的服務器上測試同樣的查詢也但您的版本比其他所有查詢花費的時間更長。 – user1820065