2012-01-23 5 views
1

SQL 문에 대한 작업은 여기에 있습니다. 나는 어리석은 질문을합니다. 필자는 년과 월 등 다양한 날짜를 뱉어내는이 날짜 필드를 얻었습니다. 나는 그들을 정확하게 정렬하려고 노력하고 있습니다 만 순서대로 만 달을 얻습니다. 예는 다음과 같이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

'그룹 기준'에 대한 귀하의 의견은 무엇입니까? 나는 어떤 요약도 표시되지 않습니다. 우리에 대한 쿼리를 단순화 했습니까? 아니면 DISTINCT 데이트를 원하십니까? – EBarr

답변

1

VARCHAR()으로 변환 된 날짜 열입니다. 대신 원래 날짜 열에 의한 주문 :

ORDER BY A.tran_end_time ASC 
+0

나는 그것이 작동하지 않을 것이라고 생각 : "문이 GROUP 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 조작보다 훨씬 빠르게 처리 할 수 ​​있기 때문입니다.