如何以字符串格式正确订购日期?

Man*_*eld 5 sql sql-server sql-server-2005

我在SQL Server 2005数据库中有一个包含以下字段的表:

  • id, integer
  • value, string
  • create_date, datetime

新数据不断被插入到此表中(每天数万条记录),因此我使用以下查询来比较在不同日期插入的数据量.

SELECT CONVERT(varchar(10), create_date, 101) as 'Date', COUNT(*) as 'Record Count',
FROM the_table
GROUP BY CONVERT(varchar(10), create_date, 101)
ORDER BY 'Date' desc
Run Code Online (Sandbox Code Playgroud)

此查询返回如下所示的数据:

12/20/2012 | 48155
12/19/2012 | 87561
12/18/2012 | 71467
Run Code Online (Sandbox Code Playgroud)

但是,在今天运行此查询时,我注意到排序无法按预期工作,数据库中有多年的数据.而不是今年的数据位于结果集的最顶端,它最终位于底部(为清晰起见省略了记录)

06/29/2012 | 9987
01/04/2013 | 15768
01/03/2013 | 77586
01/02/2013 | 23566
Run Code Online (Sandbox Code Playgroud)

我理解为什么会发生这种情况,因为我的格式化日期只是一个字符串,并且不能指望sql server将它排序为除字符串之外的任何东西.但我希望订购准确.我怎样才能做到这一点?(最近一天总是出现在第一天)

Man*_*eld 11

感谢Oded的建议我改变了我的订单条款,这似乎给了我想要的东西:

SELECT CONVERT(varchar(10), create_date, 101) as 'Date', COUNT(*) as 'Record Count',
FROM the_table
GROUP BY CONVERT(varchar(10), create_date, 101)
ORDER BY MIN(create_date) desc
Run Code Online (Sandbox Code Playgroud)

  • 再次,请养成使用显式长度的`VARCHAR`的习惯(如在`VARCHAR(10)`中),不要依赖`VARCHAR`总是自己猜测长度,最终会得到一个惊喜 (5认同)

bob*_*obs 5

您可以将日期作为日期数据类型包含在 中GROUP BY,然后在ORDER BY

SELECT top 100 CONVERT(varchar, create_date, 101) as 'Date', COUNT(*) as 'Record Count'
FROM constituent
GROUP BY CONVERT(varchar, create_date, 101), CONVERT(date, create_date)
ORDER BY CONVERT(date, create_date)
Run Code Online (Sandbox Code Playgroud)

  • SQL Server 2005 上没有“DATE”数据类型。请在 varchar 上使用显式长度 (2认同)