2013-12-20 3 views
0

날짜가 텍스트로 저장되는 테이블이 있습니다.이 필드는 다른 필드도 저장할 수 있기 때문에 텍스트가 저장됩니다.날짜 비교 2 개를 사용하면 문자열에서 날짜 및/또는 시간을 변환 할 때 변환이 실패했습니다.

해당 필드에 날짜가있는 행을 추출해야하며이 날짜는 현재 + 2 개월 이내 여야합니다.

내 쿼리는 다음과 같습니다

;WITH sel AS (SELECT t1.ItemUserID, t3.Omschrijving AS Hoofditem, 
       t4.Omschrijving AS Subitem, t2.Omschrijving AS SubItemonderdeel, 
       CONVERT(DATE,t1.subitemwaarde) AS subitemwaarde, 
       CONVERT(DATE,DATEADD(month, 2, CONVERT(DATE,GETDATE(),101))) as now_plus_2 
      FROM MainDataTable AS t1 
      LEFT JOIN SubItemsOnderdelen AS t2 ON t1.SubItemonderdeel=t2.Code 
      LEFT JOIN HoofdItemOnderdelen AS t3 ON t1.Hoofditem = t3.Code 
      LEFT JOIN ItemData AS t4 ON t1.subitem=t4.itemcode 
      WHERE t2.Omschrijving LIKE 'expires on' 
       and ISDATE(t1.SubItemWaarde) = 1) 

SELECT * FROM sel AS t2 

나는 이것을 실행하면, 나는 마지막 두 개의 열이 날짜가 표시되는 모든 데이터 테이블을 얻고 날짜 열입니다. 마지막 SELECT 문에 t2.subitemwaarde < t2.now_plus_2 , 내가 오류가 어디 를 추가

는 :

"문자열에서 날짜 및/또는 시간을 변환 할 때 변환 실패" 왜? 내가 도대체 ​​뭘 잘못하고있는 겁니까?

rg. 에릭

답변

4

자체 전에 당신은 또한 데이터 유형에 적합한 열 세트를 추가하는 것을 고려한다 WHERE

ON t1.SubItemonderdeel=t2.Code and ISDATE(t1.SubItemWaarde) = 1) 

으로 필터링 할 수 JOIN 절에 비 날짜를 제외합니다.

+0

그건 속임수 였어. 감사! – Eric

1

t2.subitemwaarde< t2.now_plus_2DateString를 비교합니다. 문제를 해결하기 위해 비교하기 전에 날짜에 t2.subitemwaarde 변환 : t2.subitemwaarde가 날짜가 아닌 경우에는 필터 ISDATE(t2.subitemwaarde) = 1을 추가해야 할 수 있도록이 오류가 발생합니다

CONVERT(DATE,t2.subitemwaarde) < t2.now_plus_2 

.

+0

그는 "다른 것을 저장합니다"라고 말하면서도 똑같은 문제에 직면하게 될 것이라고 생각하지 않습니까? – Leo

+0

술어 AND ISDATE (t1.SubItemWaarde) = 1이 적용되지 않습니다. –

+0

동의 ... 난 그냥 그 대답을 보지 못했어요 – Leo

1

시도해보십시오.

아래 형식을 사용해야한다고 생각합니다. 왜냐하면 난 당신이 어떤 날짜 형식을 변환 해야할지 모르겠다.

select CONVERT(Datetime,'20/12/2012 12:12:00.000',103) 
+0

날짜가 아닌 경우 어떻게됩니까? – Leo

+0

지정된 형식이 날짜이면 변환되고 그렇지 않으면 변환됩니다. 다른 논리가 구현됩니다. –

1

나는 완전히 당신이 날짜로 비교되는 필드 이해하지만이 같은 시도하지 말라 : 필드가 다음 날짜 및 상태인지 확인합니다

WHERE CASE WHEN ISDATE(t2.SubItemWaarde) = 1) 
    THEN CONVERT(DATE, t2.subitemwaarde) < t2.now_plus_2 
    ELSE 1=0 
    END 

기본적으로 case 문을, else 1 = 0 이는 항상 거짓이어서 행을 생략합니다.

관련 문제