Man*_*eld 5 sql sql-server sql-server-2005
我在SQL Server 2005数据库中有一个包含以下字段的表:
id, integervalue, stringcreate_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)
您可以将日期作为日期数据类型包含在 中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)