我的表架构(表名称库存)
字段
Date Datetime
如果Date
的数据类型为Datetime
,则SQL Server会按照井/完美顺序对日期进行排序。见下面的例子。
select date from stock order by date
然后结果是:
Date(yyyy/MM/dd)
2010-04-02 00:00:00.000
2011-02-02 00:00:00.000
2011-02-03 00:00:00.000
2011-02-03 00:00:00.000
但是如果我要通过转换varchar来进行排序,那么它最终会产生问题,问题是它不会按日期顺序排序,因为它现在在Varchar中进行转换。
请看下面的例子:
select date = convert(varchar, date, 103) from stock order by date
然后结果是:
Date(dd/MM/yyyy)
02/02/2011
02/04/2010
03/02/2011
03/02/2011
您可以看到第二个查询的结果是它不会按顺序排序日期,因为它现在不是datetime数据类型。它是作为varchar进行转换,或者你可以将其称为字符串。
现在说到:
如果我想按日期排序以varchar顺序排序的日期而不是如何进行排序?。
答案 0 :(得分:7)
您正在做的是将varchar
转换为varchar
,然后按此排序......您没有按日期排序!
convert(varchar, date, 103)
*********
此类型是您将价值转换为 - 您将转换为varchar
- 当然它不会按日期排序!
请改为尝试:
SELECT CONVERT(DATETIME, date, 103)
FROM dbo.Stock
ORDER BY CONVERT(DATETIME, date, 103)
现在您实际上已将varchar
列date
转换为DATETIME
值,并对生成的DATETIME
进行排序 - 现在你得到了输出:
2010-04-02 00:00:00.000
2011-02-02 00:00:00.000
2011-02-03 00:00:00.000
2011-02-03 00:00:00.000
更新:如果您需要其他格式,您当然可以使用不同风格的DATETIME
将VARCHAR
再次转换回CONVERT
:
SELECT
date = CONVERT(VARCHAR, CONVERT(DATETIME, date, 103), 103) -- convert back to VARCHAR
FROM
dbo.Stock
ORDER BY
CONVERT(DATETIME, date, 103) -- sort by the DATETIME !
然后你得到这个输出:
02/04/2010
02/02/2011
03/02/2011
03/02/2011
只需确保对 DATETIME
值进行排序! (不是DATETIME
)的字符串表示
正如我所说:如果你从一开始就把你的日期存储为DATETIME,你就可以来回保存很多这些转换!!
答案 1 :(得分:1)
您可以按如下方式使用子查询
select convert(varchar,date,103) date from (select date from stock order by date)p
答案 2 :(得分:0)
这个对我有用:
SELECT date FROM stock ORDER BY CAST(date AS DATE)