当数据类型为nvarchar时,按日期字段排序

时间:2013-04-08 11:44:38

标签: c# database sql-server-2005 join

在堆栈上有一个答案我使用了以下查询:

select 
  AVG(CASE WHEN Buy_sell = 1 and scrip_code='" + ds.Tables[0].Rows[i][2].ToString() + "' and Sauda_Date between convert(datetime,'" + dtpForDate.Value.Date.ToString("dd/MM/yyyy") + "') and convert(datetime,'" + dtpToDate.Value.Date.ToString("dd/MM/yyyy") + "') THEN Market_Rate ELSE 0 END) AS AVGBuyRate , 
  AVG(CASE WHEN Buy_sell = 2 THEN Market_Rate ELSE 0 END) AS AVGSellRate,
  CONVERT(VARCHAR(11),sauda_date) AS sauda_date,  
  SUM(CASE WHEN Buy_sell = 1 and scrip_code='" + ds.Tables[0].Rows[i][2].ToString() + "' and Sauda_Date between convert(datetime,'" + dtpForDate.Value.Date.ToString("dd/MM/yyyy") + "') and convert(datetime,'" + dtpToDate.Value.Date.ToString("dd/MM/yyyy") + "') THEN Trade_Qty ELSE 0 END) AS BuyQty,
  SUM(CASE WHEN Buy_sell = 2 and scrip_code='" + ds.Tables[0].Rows[i][2].ToString() + "' and Sauda_Date between convert(datetime,'" + dtpForDate.Value.Date.ToString("dd/MM/yyyy") + "') and convert(datetime,'" + dtpToDate.Value.Date.ToString("dd/MM/yyyy") + "') THEN Trade_Qty ELSE 0 END) AS SellQty ,     
  SUM(CASE WHEN Buy_sell = 1 and scrip_code='" + ds.Tables[0].Rows[i][2].ToString() + "' THEN Trade_Qty ELSE 0 END) -SUM(CASE WHEN Buy_sell = 2 and scrip_code='" + ds.Tables[0].Rows[i][2].ToString() + "' THEN Trade_Qty ELSE 0 END) AS CarryForword 
from tradefile 
where scrip_code='" + ds.Tables[0].Rows[i][2].ToString() + "'
  and INST_TYPE LIKE 'FUT%' 
group by CONVERT(VARCHAR(11),sauda_date) order by CONVERT(VARCHAR(11),sauda_date) desc

此查询为我提供以下输出:

enter image description here

如果我们看看sauda_date专栏,在2013年2月28日之后,它将在2013年3月22日,2013年3月21日,2013年3月20日等订购。

但应该是2013年2月28日,2013年3月1日,2013年3月2日....,2013年3月20日,2013年3月21日,2013年3月22日。

我应该在查询中做出哪些更改?

注意: sauda_date属于nvarchar类型

NEW QUERY:

select AVG(CASE WHEN Buy_sell = 1 and scrip_code='" + ds.Tables[0].Rows[i][2].ToString() + "' and Sauda_Date between convert(datetime,'" + dtpForDate.Value.Date.ToString("dd/MM/yyyy") + "') and convert(datetime,'" + dtpToDate.Value.Date.ToString("dd/MM/yyyy") + "') THEN Market_Rate ELSE 0 END) AS AVGBuyRate , AVG(CASE WHEN Buy_sell = 2 THEN Market_Rate ELSE 0 END) AS AVGSellRate,  CONVERT(VARCHAR, CONVERT(DATETIME, sauda_date, 106), 106) as Sauda_Date,SUM(CASE WHEN Buy_sell = 1 and scrip_code='" + ds.Tables[0].Rows[i][2].ToString() + "' and Sauda_Date between convert(datetime,'" + dtpForDate.Value.Date.ToString("dd/MM/yyyy") + "') and convert(datetime,'" + dtpToDate.Value.Date.ToString("dd/MM/yyyy") + "') THEN Trade_Qty ELSE 0 END) AS BuyQty,SUM(CASE WHEN Buy_sell = 2 and scrip_code='" + ds.Tables[0].Rows[i][2].ToString() + "' and Sauda_Date between convert(datetime,'" + dtpForDate.Value.Date.ToString("dd/MM/yyyy") + "',106) and convert(datetime,'" + dtpToDate.Value.Date.ToString("dd/MM/yyyy") + "',106) THEN Trade_Qty ELSE 0 END) AS SellQty ,     SUM(CASE WHEN Buy_sell = 1 and scrip_code='" + ds.Tables[0].Rows[i][2].ToString() + "' THEN Trade_Qty ELSE 0 END) -SUM(CASE WHEN Buy_sell = 2 and scrip_code='" + ds.Tables[0].Rows[i][2].ToString() + "' THEN Trade_Qty ELSE 0 END) AS CarryForword from tradefile where scrip_code='" + ds.Tables[0].Rows[i][2].ToString() + "' and INST_TYPE LIKE 'FUT%' group by convert(datetime,sauda_date,106) order by convert(datetime,sauda_date,106) desc

2 个答案:

答案 0 :(得分:4)

您正在将日期转换为文本以进行排序,因此您可以获得文本顺序。 “F”出现在“M”之前。我不知道我会说的架构:尝试从CONVERT...子句删除ORDER BY调用。

此外,您似乎需要ASC订单,而不是DESC

编辑:你说sauda_date是nvarchar类型。我要说它不应该是(使用适当的日期类型进行存储),或者你必须将它转换回日期时间进行排序。

答案 1 :(得分:1)

将最后一行更改为:

select
  ....,
  CONVERT(VARCHAR, CONVERT(DATETIME, sauda_date, 106), 106)
...
group by CONVERT(VARCHAR, CONVERT(DATETIME, sauda_date, 106), 106)
order by CONVERT(DATETIME, sauda_date, 106) asc

此外,您首先需要最低的日期,因此我认为您需要asc而不是desc