2012-01-23 1 views
1

ここでSQL文を処理しています。私は愚かな質問をしています。 Iveは年月などの様々な日付を吐き出しているこの日付フィールドを持っています。私はそれらを正しく注文しようとしていますが、私は月間だけ注文します。例は次のとおりです。次のようにSQLの日付の訂正

01-05-2012 
12-30-2011 
12-18-2011 
11-25-2011 
11-24-2011 
Etc. 

私のクエリは次のとおりです。

SELECT  TOP (100) PERCENT CONVERT(VARCHAR(10), A.tran_end_time, 110) AS Date 
FROM   dbo.ttdpur040101_CT AS A INNER JOIN 
         dbo.ttdpur040101_Audit AS B ON NOT (A.tran_begin_time > B.event_time_local OR 
         A.tran_end_time < B.event_time_local) AND (A.__$operation = 2 AND B.action_id = 'IN' OR 
         (A.__$operation = 3 OR 
         A.__$operation = 4) AND B.action_id = 'UP' OR 
         A.__$operation = 1 AND B.action_id = 'DL') AND B.class_type = 'U' 
WHERE  (B.server_principal_name = @Name) 
GROUP BY CONVERT(VARCHAR(10), A.tran_end_time, 110) 
ORDER BY Date 

次のように私はそれを示しているしたいと思います:あなたがで注文する

11-24-2011 
11-25-2011 
12-18-2011 
12-25-2011 
01-08-2012 
01-09-2012 
etc. 

おかげ

+1

そのdatetime列。 – GabrielVa

+0

あなたは 'group by'で何を考えていましたか、私は和を見ません。私たちのための質問を単純化しましたか?またはDISTINCTの日付をお探しですか? – EBarr

答えて

1

VARCHAR()に変換された日付列。代わりに元の日付の列で注文:

ORDER BY A.tran_end_time ASC 
+0

私はそれが動作しないと思う: "文がGR​​OUP BY句を含んでいる場合、ソート列は選択リストに現れなければならない" - [ORDER BY句(Transact-SQL)](http:// msdn。 microsoft.com/en-us/library/ms188385.aspx)。 –

0

これは、日付がvarcharであるためです。

このようにそれを試してみてください。

SELECT  TOP (100) PERCENT CONVERT(VARCHAR(10), A.tran_end_time, 110) AS Date 
FROM   dbo.ttdpur040101_CT AS A INNER JOIN 
         dbo.ttdpur040101_Audit AS B ON NOT (A.tran_begin_time > B.event_time_local OR 
         A.tran_end_time < B.event_time_local) AND (A.__$operation = 2 AND B.action_id = 'IN' OR 
         (A.__$operation = 3 OR 
         A.__$operation = 4) AND B.action_id = 'UP' OR 
         A.__$operation = 1 AND B.action_id = 'DL') AND B.class_type = 'U' 
WHERE  (B.server_principal_name = @Name) 
GROUP BY CONVERT(VARCHAR(10), A.tran_end_time, 110) 
ORDER BY CONVERT(DATETIME, Date, 103) ASC 
0
SELECT CONVERT(VARCHAR(10), [Date], 110) FROM (
    SELECT TOP (100) PERCENT DATEADD(dd, datediff(dd, 0, A.tran_end_time), 0) AS Date 
    FROM dbo.ttdpur040101_CT AS A 
    INNER JOIN dbo.ttdpur040101_Audit AS B ON 
     NOT (A.tran_begin_time > B.event_time_local OR 
     A.tran_end_time < B.event_time_local) AND 
     (A.__$operation = 2 AND B.action_id = 'IN' OR 
      (A.__$operation = 3 OR A.__$operation = 4) AND 
      B.action_id = 'UP' OR 
      A.__$operation = 1 AND 
      B.action_id = 'DL' 
     ) AND 
     B.class_type = 'U' 
    WHERE  (B.server_principal_name = @Name) 
    GROUP BY DATEADD(dd, datediff(dd, 0, A.tran_end_time), 0) 
) t 
ORDER BY [Date] 

かなり重要なのは、唯一の日付部分に "四捨五入" です。 varcharへの変換よりも速いのはDATEADD(dd, datediff(dd, 0, A.tran_end_time), 0)です。なぜなら、SQL Serverがvarcharの操作よりもはるかに高速に処理できるということだけです。