2012-06-22 4 views
1

날짜로 재 변환 :, 문자열로 날짜를 변환 문자열을 연결하고 I 변환 할 SQL

가에 여기
select convert(nvarchar(16), TimeLog, 120) requestTime, 
     count(Request) As noOfQueries 
from LogData 

where TimeLog between @StartDate and @EndDate 

group by convert(nvarchar(16), TimeLog, 120) order by requestTime; 

가 어디 Timelog 사이 인 절 :하지만 2012-06-21 00:00:00을 사이를 2012-06-212012-06-21을 원하는 및

2012-06-21 23:59:59는 그러므로 나는 @EndDate@StartDate23:59:5900:00:00를 추가하고 싶습니다 그래서 위의 형식으로 @Satrtdate/@EndDate을 변환 할.

+2

NVARCHAR (16) :

이 두 기사를 읽기를주십시오? 언제 유니 코드 데이터를 보관할 날짜가 언제입니까? –

+0

@AaronBertrand 답장을 보내 주셔서 감사합니다. select 문은 부적절합니다. where 절만 볼 수 있습니까? – Rish

+2

그게 바로 답이 아니라 주석이었습니다. –

답변

6

은 당신이 원하는 것은 : 그 동작은 기본 데이터 유형에 따라 다를 수 있기 때문에

SELECT 
    requestDate = CONVERT(CHAR(10), TimeLog, 120), 
    noOfQueries = COUNT(Request) 
WHERE TimeLog >= @StartDate 
AND TimeLog < DATEADD(DAY, 1, @EndDate) 
GROUP BY CONVERT(CHAR(10), TimeLog, 120) 
ORDER BY CONVERT(CHAR(10), TimeLog, 120); 

BETWEEN을 사용하지 않는 이유는. SMALLDATETIME 인 경우 반올림하고 다음 날부터 데이터를 가져옵니다. DATETIME2 인 경우 23:59:59.0000000 and 23:59:59.9999999 사이의 데이터를 놓칠 수 있습니다. 그리고 지금도 데이터 유형을 알고 있더라도 쿼리를 게시 한 후에 변경 될 수 있습니다. 누가 다시 돌아가서 23:59:5923:59:00 또는 23:59:59.9999999으로 수정합니까? 제한이없는 범위에서 다음에 일 전까지 모든 것을 선택하면 자정에이를 걱정할 필요가 없습니다.

http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil-have-in-common.aspx

http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries.aspx

+1

+1 - 나는 동의한다. (나를 때려 눕힌다.)하지만 OP가 이런 방식으로해야한다고 설명 할 수 있을까? –

+0

동의합니다. +1 아론. –