T-SQL中的orderby

T-SQL中的orderby,sql,sql-server,sql-server-2008,tsql,date,Sql,Sql Server,Sql Server 2008,Tsql,Date,我有以下代码 SELECT CASE WHEN @ID = 1 THEN CONVERT(nvarchar(10), [insert_date],101) ELSE CONVERT(nvarchar(10), [insert_date],103) END AS [insert_date] FROM Dates ORDER BY [insert_date] DESC 现在,当日期为101格式时,它以MM/DD/YYYY输出,顺序按月份正确描述,但当日期

我有以下代码

  SELECT 
    CASE WHEN @ID = 1 THEN CONVERT(nvarchar(10), [insert_date],101)
         ELSE CONVERT(nvarchar(10), [insert_date],103) 
    END AS [insert_date]
FROM Dates 
ORDER BY [insert_date] DESC
现在,当日期为101格式时,它以MM/DD/YYYY输出,顺序按月份正确描述,但当日期为103格式时,它以DD/MM/YYYY输出,顺序按天不正确描述

即使日期是DD/MM/YYYY,我如何按月订购

谢谢

试试这个:-

order by datepart(month,[insert_date]) desc
尝试使用格式112

当@ID=1时选择CASE,然后选择CONVERTnvarchar10, [插入日期],101 ELSE CONVERTNVARCAR10,[insert_date],103从CONVERTNVARCAR10的订单日期结束为[insert_date], [插入日期],112说明

您的意思是使用[insert_date]作为输入列名和输出计算列名吗?不清楚,但正如Jermy在评论中确认的那样,这确实意味着您正在重写ORDER by子句使用的值。这就是你想要的吗


除非您能保证日期是可按词汇排序的格式,如yyyy-MM-dd,否则绝对不应按其字符串表示形式对日期进行排序。除非您有很好的理由这样做,否则只应按日期本身进行排序。根本不要将其转换为nvarchar。

如果您确实希望订单使用月份,而不考虑年份,即将所有一月条目保存在一起多年,则使用@indownight提供的解决方案

如果您实际上只希望结果按日期降序排列,而不考虑日期格式,则应通过以下方式将表名作为顺序的一部分:

SELECT 
CASE WHEN @ID = 1 THEN CONVERT(nvarchar(10), [insert_date],101)
     ELSE CONVERT(nvarchar(10), [insert_date],103) 
END AS [insert_date]
FROM DateTest 
ORDER BY DateTest.[insert_date] DESC

@Matt Johnson-在SQL Server 2008 R2中对源列名和别名使用[insert_date]不会产生错误。这是一个完美的法律结构。我同意你的看法,不过OP可能并没有试图获得所述的结果——我猜他们只是想让日期始终按降序排列。@JeremyDWill——真的吗?我得检查一下。那么效果如何呢?它是否替换了原来的列?是否生成具有相同名称的第二列?ORDER BY子句使用原始表值还是计算列名称?@Matt Johnson-请参阅我最近发布的答案。我刚刚在我的开发机器上验证了这一点。简单的回答是,ORDERBY是针对select语句的结果执行的最后一步。因此,它使用的是别名列名。有关更多信息,请参阅@JeremyDWill-谢谢。我刚才也查过了,你是对的!我会更新我的答案。尽管如此,我仍然认为按日期的字符串表示形式排序是个坏主意。因为现在是2008年,所以我会使用日期类型。否则,这就是解决方案。为什么您的输出采用特定格式?在表示层,停止使用T-SQL作为前端美化工具。这就是前端的用途。谢谢你们,几乎所有的解决方案都能工作。我发布的代码是我代码的一个非常简化的版本。这些列出的解决方案有效@AaronBertrand,在那个阶段,我对前端.net/c没有太多经验来处理它:如果我只是环顾四周,这可能是件容易的事……我现在就来是的,在C语言中,look at.Format——比在SQL中更好,尤其是在按日期排序的情况下。
SELECT 
CASE WHEN @ID = 1 THEN CONVERT(nvarchar(10), [insert_date],101)
     ELSE CONVERT(nvarchar(10), [insert_date],103) 
END AS [insert_date]
FROM DateTest 
ORDER BY DateTest.[insert_date] DESC