[sql-server] SQL Server 문자열을 날짜로 변환

다음과 같이 문자열을 변환하고 싶습니다.

'10/15/2008 10:06:32 PM'

SQL Server에서 동등한 DATETIME 값으로

오라클에서는 다음과 같이 말합니다.

TO_DATE('10/15/2008 10:06:32 PM','MM/DD/YYYY HH:MI:SS AM')

이 질문 은 문자열을 표준 형식 중 하나로 구문 분석 한 다음 해당 코드 중 하나를 사용하여 변환 해야 함을 의미합니다 . 그런 평범한 작업에는 우스운 것 같습니다. 더 쉬운 방법이 있습니까?



답변

SQL Server (2005, 2000, 7.0)에는 임의로 구성된 날짜 시간을 문자열 형식으로 가져 와서 날짜 / 시간 데이터 유형으로 변환하는 융통성 또는 융통성이없는 방법이 없습니다.

“임의로”라는 말은, “당신이나 나 또는 지구 반대편에있는 사람은 아니지만, 그것을 쓴 사람이 직관적이고 완전히 명백한 것으로 생각하는 형태”를 의미합니다. 솔직히, 나는 그런 알고리즘이 있는지 확실하지 않습니다.


답변

이 시도

Cast('7/7/2011' as datetime)

Convert(varchar(30),'7/7/2011',102)

자세한 내용은 CAST 및 CONVERT (Transact-SQL) 를 참조하십시오.


답변

쿼리 프로세서를 통해이를 실행하십시오. 그것은 날짜 및 / 또는 시간과 같은 형식을 지정하며 이것들 중 하나는 당신이 찾고있는 것을 줄 것입니다. 적응하기가 어렵지 않습니다.

Declare @d datetime
select @d = getdate()

select @d as OriginalDate,
convert(varchar,@d,100) as ConvertedDate,
100 as FormatValue,
'mon dd yyyy hh:miAM (or PM)' as OutputFormat
union all
select @d,convert(varchar,@d,101),101,'mm/dd/yy'
union all
select @d,convert(varchar,@d,102),102,'yy.mm.dd'
union all
select @d,convert(varchar,@d,103),103,'dd/mm/yy'
union all
select @d,convert(varchar,@d,104),104,'dd.mm.yy'
union all
select @d,convert(varchar,@d,105),105,'dd-mm-yy'
union all
select @d,convert(varchar,@d,106),106,'dd mon yy'
union all
select @d,convert(varchar,@d,107),107,'Mon dd, yy'
union all
select @d,convert(varchar,@d,108),108,'hh:mm:ss'
union all
select @d,convert(varchar,@d,109),109,'mon dd yyyy hh:mi:ss:mmmAM (or PM)'
union all
select @d,convert(varchar,@d,110),110,'mm-dd-yy'
union all
select @d,convert(varchar,@d,111),111,'yy/mm/dd'
union all
select @d,convert(varchar,@d,12),12,'yymmdd'
union all
select @d,convert(varchar,@d,112),112,'yyyymmdd'
union all
select @d,convert(varchar,@d,113),113,'dd mon yyyy hh:mm:ss:mmm(24h)'
union all
select @d,convert(varchar,@d,114),114,'hh:mi:ss:mmm(24h)'
union all
select @d,convert(varchar,@d,120),120,'yyyy-mm-dd hh:mi:ss(24h)'
union all
select @d,convert(varchar,@d,121),121,'yyyy-mm-dd hh:mi:ss.mmm(24h)'
union all
select @d,convert(varchar,@d,126),126,'yyyy-mm-dd Thh:mm:ss:mmm(no spaces)'


답변

SQL Server Denali에서는 원하는 대상에 접근 할 수있는 작업을 수행 할 수 있습니다. 그러나 여전히 임의로 정의 된 엉뚱한 날짜 문자열을 전달할 수 없으며 SQL Server가 수용 할 것으로 기대합니다. 다음은 자신의 답변에 게시 한 내용을 사용한 예입니다. FORMAT () 함수는 로케일을 선택적 인수로 받아 들일 수 있습니다. .Net 형식을 기반으로하므로 대부분의 토큰 형식이 없을 수도 있습니다.

DECLARE @d DATETIME = '2008-10-13 18:45:19';

-- returns Oct-13/2008 18:45:19:
SELECT FORMAT(@d, N'MMM-dd/yyyy HH:mm:ss');

-- returns NULL if the conversion fails:
SELECT TRY_PARSE(FORMAT(@d, N'MMM-dd/yyyy HH:mm:ss') AS DATETIME);

-- returns an error if the conversion fails:
SELECT PARSE(FORMAT(@d, N'MMM-dd/yyyy HH:mm:ss') AS DATETIME);

날짜 입력을보다 세밀하게 관리하고 소독하는 것이 좋습니다. 사람들이 자유 형식의 텍스트 필드에 원하는 형식을 사용하여 날짜를 입력하게하는 시대는 지금 우리 뒤에 있습니다. 누군가가 2011 년 8 월 9 일에 들어가면 8 월 9 일 또는 9 월 8 일입니까? 캘린더 컨트롤에서 날짜를 선택하게하면 앱이 형식을 제어 할 수 있습니다. 사용자의 행동을 얼마나 많이 예측하려고하더라도 계획하지 않은 날짜를 입력하는 멍청한 방법을 항상 파악하게됩니다.

하지만 데날리까지는 @Ovidiu가 지금까지 최고의 조언을 가지고 있다고 생각합니다. 그런 다음 원하는만큼 엉뚱한 비표준 형식의 사례 / 스위치를 작성할 수 있습니다.


@dhergert에 대한 업데이트 :

SELECT TRY_PARSE('10/15/2008 10:06:32 PM' AS DATETIME USING 'en-us');
SELECT TRY_PARSE('15/10/2008 10:06:32 PM' AS DATETIME USING 'en-gb');

결과 :

2008-10-15 22:06:32.000
2008-10-15 22:06:32.000

여전히 다른 중요한 정보가 먼저 있어야합니다. 기본 T-SQL을 사용하여 6/9/20126 월 9 일인지 9 월 6 일인지 확인할 수 없습니다 .


답변

이 문제에 대한 가장 좋은 해결책은 DateTime.Parse 또는 ParseExact 함수 중 하나를 사용하여 지정된 형식으로 DateTime 값을 반환하는 SLR Server 2005의 CLR 함수를 사용하는 것입니다.


답변

이것을 사용하십시오 :

SELECT convert(datetime, '2018-10-25 20:44:11.500', 121) -- yyyy-mm-dd hh:mm:ss.mmm

변환 코드 는 공식 문서 의 표를 참조하십시오 .


답변

왜 안 해봐

select convert(date,'10/15/2011 00:00:00',104) as [MM/dd/YYYY]

날짜 형식은 SQL Server 도우미> SQL Server 날짜 형식 에서 찾을 수 있습니다.