2016-11-21 2 views
2

테이블에 날짜 열이 있습니다 (형식 : yyyymmdd). nvarchar으로 저장됩니다. 나는 date로 변환하고 다음 스크립트 중 하나를 사용하여 청소하기 위해 노력하고있어 :SQL Server의 날짜 변환이 계속 실패합니다

convert(varchar(10), cast(ltrim(rtrim(replace([mydate], ''"'', ''''))) as datetime), 112) [mydate] 

convert(nvarchar, cast(ltrim(rtrim(replace([mydate], ''"'', ''''))) as datetime), 112) [mydate] 

표는 수십 수천 개의 행으로 포함되어 있습니다.

나는 항상 다음과 같은 오류가 발생합니다 :

날짜 시간 데이터 형식에 nvarchar 데이터 형식의 변환이 범위를 벗어난 값의 결과.

아이디어가 있으십니까?

+0

나는 당신이'Try_Cast()'기능을 사용하여 입력 값은'NULL' 결과를 반환 무엇을 참조하시기 바랍니다. – gvee

답변

0

난 당신이

Declare @String nvarchar(25) = '20161121' 
Select cast(@String as date) 

반환

2016-11-21 
+0

명확히하기 위해 출력을 같은 형식 (예 : yyyymmdd)으로 유지해야합니다. 그냥 nvarchar 날짜로 변환해야합니다. – Jasu

+0

@Jasu 날짜를 원하는 형식으로 변환하면 해당 날짜의 문자열 표현이됩니다. 따라서 convert (varchar (10), cast (MyDate as date), 112)는 yyyymmdd 형식의 varchar를 반환합니다. –

+2

@ Jasu 이제 일부 가짜 데이터가있을 수 있습니다. 이것을 확인하려면 선택 * YourTable에서 try_convert (date, MyDate, 112)가 null 인 경우 –

2
DECLARE @Table AS TABLE (DateString NVARCHAR(25)) 
INSERT INTO @Table VALUES 
('20160101') 
,('20160230') 

;WITH cte AS (
    SELECT 
     DateString 
     ,ISDATE(DateString) as IsDate 
     ,TRY_CONVERT(DATE,DateString,112) as DateFieldTryConvert 
     ,CASE WHEN ISDATE(DateString) = 1 THEN CAST(DateString AS DATE) END as DateFieldCaseExpression 
    FROM 
     @Table 
) 

SELECT 
    * 
    ,FORMAT(DateFieldCaseExpression, 'yyyymmdd') as DateFormatedToString 
    ,CONVERT(VARCHAR(10),DateFieldCaseExpression,112) as DateConvertedToString 
FROM 
    cte 

요한이 좋은 정보를 제공하지만 난 당신을 위해 조금 확장 것이라고 생각 생각에 걸쳐있을 수 있습니다 생각한다.

  • 우선

    )를 사용하면 TRY_CONVERT에 대한 SQL 2012+()와 FORMAT을 (필요 알고, 사람들은 특히 더 큰 데이터 세트에 적용 할 때 성능 저하를 도입 할 수 있도록 SQL을 통해 호출되는 닷넷 기능도 있습니다.
  • IsDate() 함수는 성능에 큰 영향을주지 않는 SQL 함수이며 SQL에서 문자열을 합법적 인 날짜로 해석 할 수 있는지 알려줍니다. https://msdn.microsoft.com/en-us/library/ms187347.aspx
  • 다음 날짜 데이터 형식은 본질적으로 형식이 없습니다. 모든 형식은 mm/dd/yyyy, yyyymmdd 등입니다. 그 표현 방법은 컴퓨터의 지역 설정 및 SSMS의 설정에 따라 달라집니다 문자열로하면 원하는대로 다시 캐스팅/변환 할 수 있습니다.
  • 네 번째 그리고 아마도 가장 중요한 것은받은 열의 오류가 yyyymmdd 형식이 아니거나 30 일이 아니기 때문에 20/30/2016과 같은 잘못된 날짜입니다. 2 월.
  • 마지막으로 변환하는 경우 허용되는 경우 변환을 스키마 변경의 일부로 저장하고 보관하는 것이 좋습니다. 텍스트를 날짜로 저장하는 것은 실제로받는 오류와 같은 이유 때문에 나쁜 생각입니다. 범위 등을 기준으로 필터링하는 것은 항상 쿼리에 비용이 많이 드는 날짜로 변환해야합니다. SQL에서
+0

감사합니다. Matt. 참으로 나쁜 데이터입니다! 데이터 열에는 문제를 일으키는 몇 가지 지저분한 값이 있습니다. 시간과 도움을 감사하십시오. – Jasu

+0

@ 재 스는 도와 주니 기꺼이 도와주세요. 당신이 필요로하는 것이 있으면 당신을 도운 대답을 기쁘게 해주고 점수를 얻고 다른 사람들이 당신이 당신의 질문에 대답했다는 것을 알기 위해 필요한 것을 얻었습니다. 건배 – Matt

0

간단한 날짜 변환 방법

당신이 당신의 날짜 형식은 " YYYYMMDD"이라고 언급으로
DECLARE @datevar VARCHAR(8) 

SET @datevar = '20161122' 
SELECT REPLACE(CONVERT(DATE, @datevar, 112),'-','') 
0

. "yyymmdd"형식의 날짜를 받아들이므로 올바른 날짜 변환에 112 코드를 사용하고 있습니다. 따라서 쿼리에는 문제가 없습니다.

하지만 변환 방법의 입력 데이터가 잘못된 경우 문제가 발생합니다. 예를 들면

아래의 쿼리를 실행하면.형식으로 올바른 dd = 11 및 mm = 22이므로 제대로 작동합니다.

select convert(varchar(10), cast(ltrim(rtrim(replace('20161122', '"', ''))) as datetime), 112) [mydate] 

내 검색어가 이와 비슷한 경우. 여기서 나는 mm 대신 22를 넣는다. mm에 대한 최대 값이 12이므로 문제가 발생합니다.

select convert(varchar(10), cast(ltrim(rtrim(replace('20162211', '"', ''))) as datetime), 112) [mydate] 

따라서 쿼리에는 문제가 없습니다. 해당 테이블의 잘못된 데이터로 인해 문제가 발생했습니다. 이 당신을 도울 것입니다

희망 :

관련 문제