2013-07-02 71 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)

只是需要转换。

相关问题