0

我有以下代码

  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,我如何按月订购?

谢谢

4

5 回答 5

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
于 2013-04-18T17:23:54.780 回答
2

尝试这个 :-

order by datepart(month,[insert_date]) desc
于 2013-04-18T17:23:35.443 回答
1

您的意思是[insert_date]同时用作输入列名和输出计算列名吗?目前尚不清楚,但是(正如 Jermy 在评论中所证实的那样)这确实意味着您正在覆盖该ORDER BY子句使用的值。那是你要的吗?

你真的不应该通过它们的字符串表示来排序日期,除非你可以保证它们是一个词法可排序的格式(例如 yyyy-MM-dd)。除非你有非常好的理由这样做,否则你应该按日期本身排序。根本不要将其转换为 a nvarchar

于 2013-04-18T17:33:10.293 回答
1

try using format 112

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],112) DESC

于 2013-04-18T17:26:35.163 回答
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
于 2013-04-18T17:49:27.453 回答