【问题标题】:order by date field when datatype is nvarchar数据类型为 nvarchar 时按日期字段排序
【发布时间】:2013-03-30 11:34:54
【问题描述】:

使用堆栈上的答案之一,我使用了以下查询:

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

这个查询给了我下面的输出:

如果我们查看 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 类型

新查询:

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

【问题讨论】:

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


    【解决方案1】:

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

    另外,您似乎想要ASC 订单,而不是DESC

    编辑:你说 sauda_date 是 nvarchar 类型。我想说要么不应该(使用正确的日期类型进行存储),要么您必须将其转换回日期时间进行排序。

    【讨论】:

    • 我的 sauda_date 是 nvarchar 的,2013 年 2 月 28 日首先是可以的,但是在该日期序列之后应该从 2013 年 3 月 1 日开始,但从 2013 年 3 月 22 日开始,2013 年 3 月 21 日
    【解决方案2】:

    将最后一行改为:

    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

    【讨论】:

    • 列 'tradefile.Sauda_Date' 在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中。
    • lozz...很抱歉只能给1个赞,如果它在我手中,我会给你成千上万的...thanx回答。
    • 但是,还有一个问题,它没有给我平均值和总和,它向我显示所有记录,我是否应该在 convert(datetime,'" + dtpForDate.Value.Date 之间更改 Sauda_Date。 ToString("dd/MM/yyyy") + "') 和 convert(datetime,'" + dtpToDate.Value.Date.ToString("dd/MM/yyyy") + "') THEN Market_Rate ELSE 0 END) AS AVGBuyRate
    • 已编辑?它仍然显示相同的代码...CONVERT(VARCHAR(11),sauda_date)
    • 我建议您再次检查group by...保持与SELECT 子句中的相同 - CONVERT(VARCHAR, CONVERT(DATETIME, sauda_date, 106), 106)
    猜你喜欢
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多