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

时间:2013-01-04 19:30:21

标签: 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

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

12/20/2012 | 48155
12/19/2012 | 87561
12/18/2012 | 71467

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

06/29/2012 | 9987
01/04/2013 | 15768
01/03/2013 | 77586
01/02/2013 | 23566

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

7 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

您可以在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)

答案 2 :(得分:0)

我对sql-server一无所知,但我会尽力帮忙。您应该将此列替换为Date类型。我确定sql-server会知道如何正确排序。

如果这不适合您,可能在sql-server中您可以通过将字符串转换为日期类型的函数进行排序。


但看起来你已经在这里使用了日期类型。我认为您应该扩展您的查询以将select中的日期列包括为日期类型,并按该列而不是转换列进行排序。

答案 3 :(得分:0)

您可以将日期截断为凌晨12:00,而不是强制转换为字符串:

SELECT dateadd(dd, datediff(dd, 0, create_date), 0) as 'Date'
     , COUNT(*) as 'Record Count',
  FROM the_table
 GROUP BY dateadd(dd, datediff(dd, 0, create_date), 0)
 ORDER BY dateadd(dd, datediff(dd, 0, create_date), 0) desc

答案 4 :(得分:0)

你可能可以按照年份desc排序,然后按月份asc和日期asc。

答案 5 :(得分:0)

数据 是否只包含您指定的两列?如果没有,您可以选择截断到午夜的日期(建议为user1948904)以及格式化日期字段,然后按日期字段排序。然后,您可以忽略使用数据的日期字段。

修改原始查询中的错误,并将格式化日期字段添加到GROUP BY,这是必需的。

SELECT DATEADD(DAY, 0, DATEDIFF(DAY, 0, create_date)) AS raw_date,
        CONVERT(VARCHAR(10), create_date, 101) AS 'Date',
        COUNT(*) AS 'Record Count',
FROM the_table
GROUP BY DATEADD(DAY, 0, DATEDIFF(DAY, 0, create_date)),
        CONVERT(VARCHAR(10), create_date, 101)
ORDER BY raw_date DESC

答案 6 :(得分:0)

我发现其他答案不适合我的情况,因为我不想要额外的冗余日期列,或者如果我没有真正汇总查询中的任何信息,则必须使用GROUP BY(授予OP的问题包括count(*) - 我的情况完全相同,除非我没有汇总)。

此解决方案使用的DATEADD()实际上并没有强制SQL Server将其视为实际日期并返回正确的顺序。

SELECT    [Date]  = CONVERT(varchar(10), t.[create_date], 101)
          [Thing] = t.[other_column]     -- that I don't want to aggregate
FROM      [db].[dbo].[mytable] t
ORDER BY  DATEADD(dd, 0, t.[create_date]) DESC