2016-10-25 1 views
0

yyyymmddhhmmss + offset (20151125175706 + 0800)을 SQL Server의 datetime 형식으로 변환하려면 어떻게해야합니까? 마지막 1 분 동안 테이블에 입력 된 레코드를 선택하기 위해 날짜/시간 비교에 사용할 수있는 항목.varchar (예 : 20151125175706 + 0800)를 SQL의 Datetime으로 변환

메신저 OBX 세그먼트에서이 형식을 가져 오는 중이고 테이블의 varchar 필드에 그대로 저장하고 있습니다.

나는 (무엇보다도)이 작업을 수행하려고 :

select cast(convert(varchar, SUBSTRING(OBXDateTime, 1, 4) + '-' + 
SUBSTRING(OBXDateTime, 5, 2) + '-' + 
SUBSTRING(OBXDateTime, 7, 2) + ' ' + 
SUBSTRING(OBXDateTime, 9, 2) + ':' + 
SUBSTRING(OBXDateTime, 11, 2) + ':' + 
SUBSTRING(OBXDateTime, 13, 2), 101) as datetime) from ObservationPatInfo 

이 쿼리는 테이블에 1020 행 중 단지 522 행을 제공하고 "는 VARCHAR 데이터 유형의 변환을 말하는 오류 메시지로 제공 datetime 데이터 형식이 범위를 벗어난 값을 가져 왔습니다. "

친절하게 해결하도록 도와주세요.

+0

가능한 중복. http://stackoverflow.com/questions/30877285/how-can-i-reliably-convert-yyymmddhhmmssoffset-to-a-date-time –

답변

1

당신이 시도 할 수 있습니다 :

DECLARE @YourDt VARCHAR(100)='20151125175706+0800'; 
DECLARE @ISO8601_with_TimeZone VARCHAR(100); 

--This will use multiple STUFFs to get the separators into your string 
SELECT @ISO8601_with_TimeZone = STUFF(STUFF(STUFF(STUFF(STUFF(STUFF(@YourDt,18,0,':'),13,0,':'),11,0,':'),9,0,'T'),7,0,'-'),5,0,'-'); 

--This looks like a properly formatted datetime now: 2015-11-25T17:57:06+08:00 
SELECT @ISO8601_with_TimeZone; 

--Use DATETIME2 and code 127 to convert ISO8601 with TimeZone 
SELECT CONVERT(datetime2,@ISO8601_with_TimeZone,127); 
+0

Thx man ... it worked !!! – Arawn

1

사용 TRY_CONVERT 나쁜 값을 찾을 수 있습니다 :

select pi.* 
from (select try_convert(ddatetime, 
         (SUBSTRING(OBXDateTime, 1, 4) + '-' + 
          SUBSTRING(OBXDateTime, 5, 2) + '-' + 
          SUBSTRING(OBXDateTime, 7, 2) + ' ' + 
          SUBSTRING(OBXDateTime, 9, 2) + ':' + 
          SUBSTRING(OBXDateTime, 11, 2) + ':' + 
          SUBSTRING(OBXDateTime, 13, 2) 
         ), 101) as datetime) as dte, pi.* 
     from ObservationPatInfo pi 
    ) pi 
where dte is null; 
관련 문제