2012-10-08 2 views
0

SQL에서 datediff를 사용하고 있습니다. SQL Server 2008에서 직접 실행하면 레코드를 반환하지만 ODBC를 통해 실행하면 오류가 발생하지 않지만 행을 반환하지 않습니다.SQL의 DateDiff

SELECT mc_id, mc_date_entered, 
COUNT([mv_value]) total 
FROM MarkbookValue t1 
    RIGHT JOIN MarkbookColumn t2 ON t1.mv_column_id = t2.mc_id 
WHERE mc_module_id = '703000026609358' 
    AND DateDiff(dd, mc_date_entered, '2012-10-05 20:00:00') = 0 
    AND mc_type = 'KEF' 
    AND mc_entered_by = 'A.ADMIN' 
GROUP BY 
    mc_id, mc_date_entered; 

DateDiff를 없애면 기능이 제대로 실행될 수 있지만 분명히 거기에 넣을 수 있습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+0

다르게 해석되는 날짜 형식 일 수 있습니다. 대신 '2012-10-05T20 : 00 : 00'을 시도하십시오. –

+0

'T'가 해결했습니다. 이 답변을 팬시로 추가하면 받아 들일 것입니다. – pluke

답변

2

YYYY-MM-DD HH:MM:SS은 SQL Server의 날짜 시간 리터럴 값에 사용할 안전한 날짜 형식이 아닙니다. SET DATEFORMAT에 따라 월과 일 부분이 전환 될 수 있습니다.

YYYY-MM-DDTHH:MM:SSYYYYMMDD HH:MM:SSSET DATEFORMAT에 관계없이 사용하는 것이 안전합니다.

특정 날짜의 행을 얻으려면 @RichardTheKiwi에서 제공하는 대답을 따르거나 SQL Server 2008의 경우 열을 날짜로 전송하여 시간 부분을 제거 할 것을 제안합니다.

where cast(mc_date_entered as date) = '2012-10-05' 

YYYY-MM-DD데이터 유형 date 안전이다.

+0

'YYYY-MM-DD'가'date'와 함께 사용하는 것이 안전하다는 것을 몰랐습니다. 고마워요. –

+1

@AndriyM - 편집 해 주셔서 감사합니다. [YYYY-MM-DD HH : MM : SS는 datetime2에도 안전합니다.] (http://connect.microsoft.com/SQLServer/feedback/details/290971/deprecate-the-date-literal-interpretation-yyyy-dd- mm- 호환 모드 제외 - 90) –

3

대시가없는 YYYYMMDD 형식의 날짜를 거의 항상 ISO-8601 형식으로 작성합니다.
쿼리에서 mc_date_entered의 인덱스를 사용하고 SARGABLE으로 남겨두기를 원한다면, 다음과 같이 다시 작성하는 것이 좋습니다.

SELECT mc_id, mc_date_entered, COUNT([mv_value]) total 
FROM MarkbookValue t1 
RIGHT JOIN MarkbookColumn t2 ON t1.mv_column_id = t2.mc_id 
WHERE mc_module_id = '703000026609358' 
    AND mc_date_entered >= '20121005' 
    AND mc_date_entered < '20121006' 
    AND mc_type = 'KEF' 
    AND mc_entered_by = 'A.ADMIN' 
GROUP BY 
    mc_id, mc_date_entered; 

당신은 또한 DATEDIFF(DD는 날짜 부분을 고려 알고 있습니다, 그래서 시간 (우리가 아직 DATEDIFF를 사용하고있는 경우)를 포함하여 정말 아무 소용이 없다?

+0

dd 문제를 지적 해 주셔서 감사합니다. 나는 dd와 분 사이를 전환했고 dd는 미끄러졌다. 정말로 분을 읽어야합니다. – pluke

+0

쿼리가 잘 수행되도록하려면'mc_date_entered'에 인덱스를 추가하고 조건을 'AND mc_date_entered> ='2012-10-05 20:00:00 '및 mc_date_entered RichardTheKiwi

+0

Richard Richard 저는 이것을 구현하고 있습니다. 두 답을 모두 받아들이고 싶습니다만, 불행히도이를 허용하지 않습니다. 당신의 대답에 경의를 표하지 않지만 다른 하나는 제 문제에 더 가깝습니다. – pluke