从1月到12月开始排序日期(格式为“2001年1月”)

时间:2012-04-03 20:25:24

标签: sql sql-server-2008 tsql

我有这个查询,它返回一个结果集,其中Date(列)为nvarchar数据类型。

SELECT DISTINCT 
    DateName( month , DateAdd( month , (CONVERT(int,DateField1)) - 1 , '2000-01-01' ) ) 
    +' '+ DateName( year , DateAdd( year , (CONVERT(int,DateField2)), '2000-01-01' ) ) AS [Date] 
FROM dbo.table1 
WHERE DateName( year , DateAdd( year , (CONVERT(int,DateField2)), '2000-01-01' ) )= 2009.

这里DateField1和DateField2是table1中的列。

我得到的结果如下所示

--------------
Date
--------------
March 2009
June 2009
August 2009
September 2009
July 2009
May 2009
November 2009
December 2009
February 2009
April 2009
January 2009
October 2009 

我想从2009年1月到2009年12月对结果集进行排序。

帮助表示赞赏。

由于 希德

2 个答案:

答案 0 :(得分:2)

您可以直接投出最终结果(我已将调用包装在子查询中,而不是在这种情况下通过强制转换排序)

SELECT *
FROM
(
    SELECT DISTINCT 
        CAST(
            DateName( month , DateAdd( month , (CONVERT(int,DateField1)) - 1 , '2000-01-01' ) ) 
            +' '+ DateName( year , DateAdd( year , (CONVERT(int,DateField2)), '2000-01-01' ) ) 
        AS DATETIME) AS   [Date] 
    FROM dbo.table1 
    WHERE DateName( year , DateAdd( year , (CONVERT(int,DateField2)), '2000-01-01' ) )= 2009
) AS MyDate
ORDER BY Date

SQL Server将能够适当地转换它:Here is the fiddle to show the cast works

答案 1 :(得分:1)

  1. 您可以按原始字段排序(DateField2,DateField1,如果我看到的话) 它正确)
  2. 您可以将月份名称重新设置为日期并对其进行排序。
  3. 您可以在order by子句中的选择中合并您的计算。