2013-07-26 2 views
1

이 같은 날짜 및 시간의 열이 있습니다변환 VARCHAR 2008

20/Mar/2013:02:28:47 
    20/Mar/2013:02:28:43 
    20/Mar/2013:02:28:47 
    20/Mar/2013:02:28:47 
    20/Mar/2013:02:28:47 
    20/Mar/2013:02:28:47 
    20/Mar/2013:02:28:41 
    20/Mar/2013:02:28:46 

이 열의 데이터 유형은 "VARCHAR"로 설정됩니다. 난 그냥에 컬럼의 다음과 같은 형식을 변환해야합니다

20/03/2013:02:28:47 
    20/03/2013:02:28:43 
    20/03/2013:02:28:47 
    20/03/2013:02:28:47 
    20/03/2013:02:28:47 
    20/03/2013:02:28:47 
    20/03/2013:02:28:41 
    20/03/2013:02:28:46 

도 내가 SQL 날짜와 시간 데이터 형 VARCHAR에서의 데이터 유형을 변경할 수 있습니다! 내가 좋아하는 내 쿼리를 시도하고있다 :

SELECT convert(mydatetimecolumn,105) from mytable 

그러나 그것은 나에게 같은 결과를 제공합니다

1900-04-16 00:00:00.000 
    1900-04-16 00:00:00.000 
    1900-04-16 00:00:00.000 
    1900-04-16 00:00:00.000 
    1900-04-16 00:00:00.000 

가 어떻게이 문제를 극복 할 수 있습니까? 누군가 제발 도와 주실 수 있나요? 미리 감사드립니다!

+7

왜 datetime 값을 문자열 열에 저장합니까? 또한 3 월 4 일의 모습을 보여줄 수 있습니까? 그것은 0을 선도하고 있는가? –

+0

실제로 엑셀 파일에서 데이터를 가져오고 있습니다. – user2496503

+3

오케이, 그렇다면 엑셀 파일에 왜 이런 형식이 있습니까? 실제로 웹 서버에서 생성 되었기 때문에 –

답변

4

올바르게 변환 할 수없는이 열에 정크가 없다고 가정하면 가능한 해결책입니다 (어떤 이유로 날짜를 문자열로 저장하기로 결정했기 때문에 가능합니다).

이 샘플은이며 기존 테이블에 직접 적용 할 수 없습니다. 이것은 의도적입니다. 의도적으로 tempdb에 가상의/의미가없는 테이블 이름이 만들어 지므로 프로덕션 테이블에 대해 직접적으로 직접 시도하는 대신 시도해 볼 수 있습니다. 왜냐하면, 실제 테이블에 대한 업데이트를 실행하고 예상대로 작동하지 않는다면 어떻게 될까요? 백업 있어요? 다시 테이블에 쓰레기가없는 가정 실제 테이블의 경우

USE tempdb; 
GO 

CREATE TABLE dbo.floob(splunge VARCHAR(32)); 

INSERT dbo.floob(splunge) VALUES('20/Mar/2013:02:28:47'),('4/Mar/2013:02:25:32'); 

UPDATE dbo.floob SET splunge = CONVERT(CHAR(8), 
    CONVERT(DATETIME, REPLACE(LEFT(splunge, 
    CHARINDEX(':', splunge)-1), '/', ' '), 13), 112) 
    + ' ' + RIGHT(splunge, 8); 

SELECT splunge FROM floob; 
GO 

SELECT CONVERT(DATETIME, splunge) FROM floob; 
GO 

ALTER TABLE dbo.floob ALTER COLUMN splunge DATETIME; 
GO 

SELECT splunge FROM floob; 
GO 

는, 당신은 UPDATEALTER 부품 (물론 floobsplunge 대신 실제 테이블 및 열 이름에 넣어) 만 할 것입니다.

SQLfiddle example

+0

새 테이블을 만들 필요가 없습니다! : – user2496503

+4

@ user2496503 알겠습니다.이 샘플은 * 실제 * 테이블에 적용하기 전에 직접 시도해보고 작동하는지 확인하십시오. 실제 테이블이나 컬럼을 제공하지 않았습니다. 어쨌든 이름이 붙어 있기 때문에 내가 갖고있는 물건에 맞지 않는 해결책을 기대하는 이유가 확실치 않습니다. –

0

한 가지 방법; 사용

cast(stuff(replace(@s, '/', ' '), len(@s) - 8, 1, ' ') as datetime) 

날이 d 또는 dd 경우

declare @s varchar(32) = '20/Mar/2013:02:28:46' 

select cast(stuff(replace(@s, '/', ' '), 12, 1, ' ') as datetime) 

(No column name) 
2013-03-20 02:28:46.000 

.