订单不工作日期时间101格式

时间:2015-01-21 19:24:18

标签: sql-server sql-server-2008 sql-server-2005

Create table #temp
(
OrderDate datetime
)

insert into #temp values ('01/21/2015'),('01/20/2014'),('11/12/2013')

select distinct convert(varchar(10),orderdate,101) as OrderDate  from #temp 
order by convert(varchar(10),orderdate,101) asc

以上查询给出了如下结果:

OrderDate
01/20/2014
01/21/2015
11/12/2013

但我想得到如下结果:

OrderDate
11/12/2013
01/20/2014
01/21/2015

以上只是我尝试按格式 101 进行排序的示例。在我的实际查询中,我需要使用 distinct 关键字,并且列将通过使用参数在select语句中动态生成。

我无法在实际查询中使用group by。

请帮忙。

2 个答案:

答案 0 :(得分:3)

<强>更新

参考您的评论,我设法获得 UNIQUE 结果的唯一方法是,只有一列orderdate转换为VARCHAR 101表示,同时仍根据DATETIME排序顺序,使用了GROUP BY子句的一些解决方法:

SELECT 
    CONVERT(VARCHAR(10), A.OrderDate, 101) as orderdate
FROM 
    #temp AS A
GROUP BY
    CONVERT(VARCHAR(10), A.OrderDate, 101) 
ORDER BY 
    MAX(A.OrderDate) ASC

MAX(A.OrderDate)应始终为您提供与每个组的值完全相同的值,因此它不应该是一种不正确的方式 - 我在上的以下链接中添加了一个重复的实例SQL Fiddle 即可。

仍然可能以前的双柱解决方案恰好有用:

select distinct 
    convert(varchar(10),orderdate,101) as OrderDateConverted,
    orderdate
from 
    #temp 
order by 
    orderdate asc

上述查询根据DATETIME数据类型对查询结果进行排序,而order by convert(varchar(10),orderdate,101)导致字母数字排序顺序。

答案 1 :(得分:0)

您可以按如下方式使用subQuery来解决问题。

SELECT t.OrderDate FROM (
SELECT distinct Convert(VARCHAR(10), orderdate, 101) AS OrderDate
  from #temp ) t
order by     cast(t.OrderDate AS DATETIME) asc