在T-SQL中排序

时间:2013-04-18 17:20:09

标签: 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输出,顺序正确(DESC按月),但当日期为103格式时,输出为DD / MM / YYYY,顺序为不正确(按天DESC)。

即使日期为DD / MM / YYYY,我怎样才能按月订购?

谢谢

5 个答案:

答案 0 :(得分:3)

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 CONVERT(nvarchar(10), [insert_date],101) DESC

答案 1 :(得分:2)

试试这个: -

order by datepart(month,[insert_date]) desc

答案 2 :(得分:1)

尝试使用格式112

  

当@ID = 1 THEN CONVERT时选择情况(nvarchar(10),   [insert_date],101)        ELSE CONVERT(nvarchar(10),[insert_date],103)END AS [insert_date] FROM Dates ORDER BY CONVERT(nvarchar(10),   [insert_date],112)DESC

答案 3 :(得分:1)

您的意思是使用[insert_date]作为输入列名称,还是输出计算列名称?它不清楚,但(正如Jermy在评论中所证实的那样)这意味着你要覆盖ORDER BY子句使用的值。这就是你想要的吗?

除非您可以保证它们采用词法可排序的格式(例如yyyy-MM-dd),否则您绝不应该按字符串表示法排序日期。除非你有一些非常好的理由,否则你应该按日期排序。不要将它转换为nvarchar

答案 4 :(得分:1)

如果您确实希望订购使用月份,无论年份如何(即将所有1月份的条目保存在一起多年),请使用@Indoknight的解决方案。

如果您实际上只想按日期的降序排列结果,而不考虑日期格式,那么请将表名作为订单的一部分包括在内:

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