2013-07-02 121 views
0

此查詢在Sql Server Management Studio中正常工作,但是當我嘗試在數據集中運行時&從日期時間選擇器傳遞日期(@Param2 & @Pram3)它拋出一個異常轉換失敗。我不知道什麼是錯的,我的其他查詢工作正常。這是因爲聯盟嗎?從字符串轉換日期和/或時間時轉換失敗

.NET代碼

startDatePicker.Format = DateTimePickerFormat.Short; 
endDatePicker.Format = DateTimePickerFormat.Short; 
DataTable ntwTable = ntw.GetData(owner,start,end); 
start = startDatePicker.Value.ToShortDateString(); 
end = endDatePicker.Value.ToShortDateString(); 

SQL

SELECT  o.Name, SUM(sq.SQuantity * sq.SRate) AS TotalSale, SUM(sq.PrQuantity * sq.PrRate) AS TotalPurchase, (SUM(sq.PQuantity) - SUM(sq.SQuantity)) 
           * (SUM(sq.PQuantity * sq.PRate)/SUM(sq.PQuantity)) AS Inventory 
     FROM   (SELECT  OwnerId, CompanyId, Quantity AS PQuantity, RatePerShare AS PRate, 0 AS SQuantity, 0 AS SRate, 0 AS PrQuantity, 0 AS PrRate, Date 
            FROM   Purchase 
            UNION ALL 
            SELECT  OwnerId, CompanyId, 0 AS PQuantity, 0 AS PRate, 0 AS SQuantity, 0 AS SRate, Quantity AS PrQuantity, RatePerShare AS PrRate, Date 
            FROM   Purchase AS pr 
            UNION ALL 
            SELECT  OwnerId, CompanyId, Quantity AS PQuantity, 0 AS PRate, 0 AS SQuantity, 0 AS SRate, 0 AS PrQuantity, 0 AS PrRate, Date 
            FROM   Bonus 
            UNION ALL 
            SELECT  OwnerId, CompanyId, Quantity AS PQuantity, CostOfShare AS PRate, 0 AS SQuantity, 0 AS SRate, 0 AS PrQuantity, 0 AS PrRate, Date 
            FROM   RightShare 
            UNION ALL 
            SELECT  OwnerId, CompanyId, 0 AS PQuantity, 0 AS PRate, Quantity AS SQuantity, RatePerShare AS SRate, 0 AS PrQuantity, 0 AS PrRate, Date 
            FROM   Sales) AS sq INNER JOIN 
           Owner AS o ON o.OwnerId = sq.OwnerId 
     WHERE  (o.OwnerId = @Param1) AND (sq.Date BETWEEN @Param2 AND @Param3) 
     GROUP BY sq.CompanyId, o.Name 
+0

什麼是@Param2和@Param3的數據類型?你如何在代碼中調用查詢? – LittleBobbyTables

+0

你沒有顯示調用代碼。但幾乎肯定是因爲(在某些情況下)會導致'datetime'值不必要地轉換爲字符串。然後事情轉換回'datetime'值 –

+0

我們可以看到代碼在哪裏通過它...如果它在SSMS中,而不是在C#中,它可能是一個傳入它的問題。 – logixologist

回答

1

在你的代碼,也有失敗的兩(明顯)的可能性。

第一個將出現在date列中的隱式轉換錯誤中。如果purchase.date是日期/時間值,但會發生這種情況,但union all中的列不是:bonus.date,rightshares.date , or sales.date . To be honest, I would be surprised if this is the case. However, it is easy enough to check for. Just run the聯合在SSMS中查詢是否發生錯誤。

第二種可能性是@Param1@Param2有問題。這些似乎是作爲字符串傳遞的。您可以通過查看字符串,只是在做測試:

select cast(@Param1 as datetime), cast(@Parame2 as datetime) 

一個可能的問題是在操作系統和數據庫級別不同的日期格式。例如,2013年1月20日可能是1月20日,另外一個錯誤。如果出現這種問題,您可以使用convert()將參數轉換爲正確的格式(在數據庫中),或者在傳遞它們之前將其轉換。

+0

我試過了,但還是沒有運氣 – user2516394

+0

(CONVERT(CHAR(10),sq.Date,111 )BETWEEN @ Param2 AND @ Param3) 非常感謝您的回答! – user2516394

0

我相信這不是最好的答案,但是,這似乎是由於區域設置。如果更改以下兩行:

start = startDatePicker.Value.ToShortDateString(); 
end = endDatePicker.Value.ToShortDateString(); 

要:

start = startDatePicker.Value.ToString("yyyy-MM-dd HH:mm:ss") 
end = endDatePicker.Value.ToString("yyyy-MM-dd HH:mm:ss") 

然後,我相信這應該能正常運行。

0

(CONVERT(CHAR(10),sq.Date,111)@之間參數2和@參數3)

只是需要轉換。

相關問題