2014-06-13 2 views
1

나는 다른 datetime 필드와 비교하기 위해 datetime으로 변환해야하는 nvarchar 열인 activedate 테이블을 가지고 있습니다. 나의 현재 데이터의 형식은 다음과 같습니다nvarchar datetime을 SQL Server 2008의 datetime으로 변환하는 방법은 무엇입니까?

3/19/2013 4:18:59 

나는 이것을 시도 :

 alter table [stresstest].[dbo].[temporaryVSDB] 
    alter column activateDate datetime; 

convert(datetime,activateDate,101) 

그러나 작동하지

.

Conversion failed when converting date and/or time from character string. 

이 도와주세요 :

나는 다음과 같은 오류 메시지가 무엇입니까.

+0

그리고 정확하게 '작동하지 않는'무엇 : 당신이 그것을 변경하는 경우 현재 스크립트가 작동합니까? 오류 메시지가 나타 납니까? 'activateDate' 열에 datetime 형식이 유효하지 않을 수 있습니까? – NickyvV

+0

'작동하지 않음'은 무엇을 의미합니까? 어떤 오류 메시지? – Paolo

+0

내 업데이트 된 질문을 확인하십시오 – barsan

답변

0

가능성이 높습니다. 세 번째 opf가 19 번째 월이면 validadatetime이 아니기 때문일 수 있습니다.

RTFM은 형식 101이 mm/dd/yyyy라고 말합니다. 이는 나에게만 날짜처럼 보입니다.

TIme에는 http://msdn.microsoft.com/en-us/library/ms187928.aspx의 테이블에서 볼 수있는 다른 형식 코드가 있습니다 (즉, 문서 의미).

0

주어진 날짜 형식을 설정하거나 datetime 값을 삽입하기 만하면됩니다.

그것을 확인하십시오. 이 오류가 발생하는 이유 날짜 시간은 그게 전부에 대한

declare @t table(dtcolumn datetime) 

set dateformat mdy 
insert into @t values('3/19/2013 4:18:59') 

select * from @t 
0

시스템은 MDY 형식으로 설정되어 있지 않습니다. 날짜 형식을 변경해보십시오.

SET DATEFORMAT MDY; 
SELECT CAST('19/3/2013 4:18:59' AS DATETIME) 

그러나, DATEFORMATSET LANGUAGE의 암시 적 날짜 형식 설정을 무시 SET.

0

datatime을 nvarchar 또는 다른 문자 유형으로 저장하면 안됩니다. datetime은 datetime 필드에 속합니다. 그것을 비교하면서 그것을 변환하면, 당신은 끔찍한 성능을 얻을. 현재 데이터 모델에 문제가있는 경우 새 계산 된 필드를 추가 할 수 있습니다. 다음은 PERSISTED 계산 열로의 변환입니다. PERSISTED 계산 열은 인덱싱 할 수있는 실제 값을가집니다.

이 예제는 지옥처럼 보입니다. 그러나 귀하의 필드를 계산합니다. 정상적인 계산 열을 사용하기는 쉽지만 성능 문제가 발생합니다. YourColumn의 모든 값에 유효한 datetime 값이 있어야합니다.

CREATE TABLE #t(YourColumn varchar(18)) 
INSERT #t 
values ('3/19/2013 4:18:59'), 
     ('3/9/2013 5:18:59'), 
     ('01/9/2013 6:18:59'), 
     ('12/9/2013 17:18:59') 


ALTER TABLE #t 
ADD CDateColumn AS 
    CONVERT(datetime, 
    LEFT(STUFF(YourColumn, 1, CHARINDEX('/', YourColumn, 4), ''), 4) 
    +'-' + SUBSTRING('0' + YourColumn, PATINDEX('%__/%', ' ' +YourColumn), 2) + '-' 
    +RIGHT('0'+REPLACE(LEFT(STUFF(YourColumn, 1, CHARINDEX('/', YourColumn), ''), 2), '/', ''), 2) + 'T' 
    +RIGHT('0'+REPLACE(LEFT(STUFF(YourColumn, 1, CHARINDEX(' ', YourColumn), ''), 2), ':', ''), 2) 
    +RIGHT(YourColumn, 6), 126) PERSISTED 

결과는 다음과 같습니다

SELECT * FROM #t 

YourColumn   CDateColumn 
3/19/2013 4:18:59 2013-03-19 04:18:59.000 
3/9/2013 5:18:59 2013-03-09 05:18:59.000 
01/9/2013 6:18:59 2013-01-09 06:18:59.000 
12/9/2013 17:18:59 2013-12-09 17:18:59.000 

NB :

CONVERT(datetime,activateDate,0) 
관련 문제