2012-02-14 63 views
0

你好,我有這樣的代碼,我試圖解決的問題是,當我通過在同一年度內的參數說查詢沒有返回正確的記錄

startDate = 01/01/2011 EndDate 07/01/2011 

它的工作原理,它返回正確的數據,但問題是,當我嘗試用不同的年份使用它,說

startDate = 02/01/2011 EndDate 01/25/2012 
--(wont work shows blank all thought there is data in both years). 

這裏是我的SQL代碼

ALTER PROCEDURE [dbo].[GetOrderByDateRange] 
    @startDate nvarchar(50), 
    @endDate nvarchar(50) 
AS 
BEGIN 
    DECLARE @days varchar(100) 
    set @days = DATEDIFF(d, @StartDate, DATEADD(day,+1,@EndDate)) 

    SELECT distinct(CONVERT(char(10), OrdDate, 101)) as OrdDate, 
    COUNT(PurchaseId) as OrdCount, 
    SUM(Total) as OrdTotals, 
    AVG(Total) as AvgOrdAmount, 
    SUM(SubTotal) as Net, 
    @days as 'Days' 
    FROM [PurchaseOrders] 
    WHERE CONVERT(char(10), OrdDate, 101) >= @startDate 
     AND CONVERT(char(10), OrdDate, 101) <= @endDate 
    GROUP BY CONVERT(char(10), OrdDate, 101) 
END 

GO 
+0

也許DB只包含2011年1月的數據?請爲您提到的以前的參數顯示幾行返回的行。此外,您正在單個查詢中進行4次日期時間轉換,而不是最佳 – sll 2012-02-14 15:25:10

+0

爲什麼不使用DATETIME作爲數據類型? – flayto 2012-02-14 15:27:06

+0

它擁有所有月份的數據..,它可以在同一年或任何日期的1月1日至12月31日運行,只要它們在同一年..問題是在說什麼時11/01/2011 - 02/02/2012 – user710502 2012-02-14 15:27:27

回答

2

不要使用CONVERT ......假設OrdDate是DATETIME列轉換,它應該是:

CREATE PROCEDURE dbo.GetOrderByDateRange 
    @StartDate DATE, -- pass 'yyyy-mm-dd' format 
    @EndDate DATE 
AS 
BEGIN 
    SET NOCOUNT ON; 
... 
    WHERE OrdDate >= @startDate AND OrdDate < DATEADD(DAY, 1, @endDate) 
END 
GO 
+0

非常感謝 – user710502 2012-02-14 15:30:57

0

儘量把日期爲標準的格式是YYYY-MM-DD

希望這是有益