programing

SQL Server에서 varchar를 datetime으로 변환

jooyons 2023. 6. 29. 20:03
반응형

SQL Server에서 varchar를 datetime으로 변환

형식 문자열을 변환하는 방법mmddyyyy안으로datetimeSQL Server 2008에서?

대상 열이 다음 위치에 있습니다.DateTime

와 해본 적이 있습니다.Convert그리고 대부분은Date스타일 값이 표시되지만 오류 메시지가 표시됩니다.

'varchar 데이터 형식을 datetime 데이터 형식으로 변환하여 값이 범위를 벗어났습니다.'

OP는 mmddyy를 원하며 일반 변환은 이에 대해 작동하지 않습니다.

select convert(datetime,'12312009')

Msg 242, Level 16, State 3, Line 1 
The conversion of a char data type to a datetime data type resulted in 
an out-of-range datetime value

그러니 이것을 시도해 보십시오.

DECLARE @Date char(8)
set @Date='12312009'
SELECT CONVERT(datetime,RIGHT(@Date,4)+LEFT(@Date,2)+SUBSTRING(@Date,3,2))

출력:

-----------------------
2009-12-31 00:00:00.000

(1 row(s) affected)

SQL Server는 'YYYYMMDD' 형식의 문자열을 datetime에 암시적으로 캐스트할 수 있습니다. 다른 모든 문자열은 명시적으로 캐스트해야 합니다.다음 두 개의 빠른 코드 블록은 당신이 말하는 양식에서 변환될 것입니다.

버전 1은 단위 변수를 사용합니다.

BEGIN 
DECLARE @input VARCHAR(8), @mon CHAR(2), 
@day char(2), @year char(4), @output DATETIME

SET @input = '10022009'   --today's date


SELECT @mon = LEFT(@input, 2), @day = SUBSTRING(@input, 3,2), @year = RIGHT(@input,4)

SELECT @output = @year+@mon+@day 
SELECT @output 
END

버전 2에서는 단위 변수를 사용하지 않습니다.

BEGIN 
DECLARE @input CHAR(8), @output DATETIME
SET @input = '10022009' --today's date 

SELECT @output = RIGHT(@input,4) + SUBSTRING(@input, 3,2) + LEFT(@input, 2)

SELECT @output
END

두 경우 모두 이러한 암묵적 변환을 수행할 수 있는 SQL 서버의 기능에 의존합니다.

변환할 수 없는 잘못된 데이터가 있을 수 있습니다.날짜는 가능한 한 빨리 또는 2009년 2월 30일과 같은 날짜를 허용하기 때문에 절대로 바르샤바에 저장해서는 안 됩니다.변환할 수 없는 레코드를 찾으려면 데이터의 isdate() 함수를 사용합니다.

네, 저는 알려진 좋은 데이터로 테스트를 했고 여전히 메시지를 받았습니다.12302009가 mmddyyyy인지 ddmmyyyy인지 알 수 없으므로 다른 형식으로 변환해야 합니다.yyyymmdd의 형식은 모호하지 않으며 SQL Server가 올바르게 변환합니다.

내가 할 일이 있어요.

cast( right(@date,4) + left(@date,4) as datetime)

'112009'와 같이 비표준 형식이거나 일부 텍스트 값 또는 실제 범위를 벗어난 날짜가 있는 경우에도 오류 메시지가 표시됩니다.

이것이 문자열 조작 없이도 변환에 도움이 된다는 것을 알게 되었습니다.https://learn.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql

CONVERT(VARCHAR(23), @lastUploadEndDate, 121)

yyyy-mm-dd hh:mi:ss.mmm(24h)은 제가 필요로 하는 형식이었습니다.

변환이 일반적인 답변이지만 변환기에 대해 인식되는 형식이 아닙니다. mm/dd/yyy는 변환기(datetime, your datestring, 101)를 사용하여 변환할 수 있지만 해당 형식이 없으므로 실패합니다.

문제는 형식이 비표준이라는 것입니다. 변환기가 사용 가능한 표준에서 이해할 수 있는 표준으로 조작해야 합니다.

형식을 보장할 수 있다면 함께 해킹됩니다.

declare @date char(8)
set @date = '12312009'
select convert(datetime, substring(@date,5,4) + substring(@date,1,2) + substring(@date,3,2),112)

보다CAST/CONVERT시작해야 할 BOL에서.

이 대상열다같경은인 datetime변환할 필요가 없습니다. SQL이 대신 변환해 줄 것입니다.

그렇지않으면

CONVERT(datetime, '20090101')

해야 돼요.

링크는 다음에도 도움이 될 것입니다.

제가 쓰겠습니다.STUFF에 할문삽다를입사음용다니합한자분다▁to를 합니다.CONVERT과 같은 이와 같은 것:

DECLARE @dt VARCHAR(100)='111290';
SELECT CONVERT(DATETIME,STUFF(STUFF(@dt,3,0,'/'),6,0,'/'),3)

▁times▁two다니▁first 두 번 합니다.STUFF111290 대신 11/12/90을 얻기 위해, 이것을 변환하기 위해 3을 사용하는 것보다.datetime 형식:). 독어의경우일,우경▁german,-영국의 경우...) 자세한 내용은

날짜 및 시간 값을 올바르게 저장하는 것이 가장 좋습니다.

어떤 문화적 형식도 조만간 문제를 일으킬 것입니다.

Try_Convert 사용:캐스트가 성공하면 지정한 데이터 형식으로 캐스트된 값을 반환하고, 성공하지 않으면 null을 반환합니다.

DECLARE @DateString VARCHAR(10) ='20160805'
SELECT TRY_CONVERT(DATETIME,@DateString)

SET @DateString ='Invalid Date'
SELECT TRY_CONVERT(DATETIME,@DateString)

링크:MSDN TRY_CONVERT(트랜잭션-SQL)

저는 비슷한 것에 운이 좋았습니다.

Convert(DATETIME, CONVERT(VARCHAR(2), @Month) + '/' + CONVERT(VARCHAR(2), @Day)
+ '/' + CONVERT(VARCHAR(4), @Year))

이 문제의 근본 원인은 지역 설정, 예를 들어 DD-MM-YYY(러시아 로케일 형식)와 같이 앱이 있는 동안 YYYY-MM-DD를 기다리는 DB에 있을 수 있습니다.제가 한 모든 것은 - 로케일 형식을 러시아어에서 영어(미국)로 변경하고 voila로 변경했습니다.

이것이 가장 쉬운 방법인 것 같습니다.

SELECT REPLACE(CONVERT(CHAR(10), GETDATE(), 110),'-','')

삽입 또는 업데이트 중 SQL 표준 날짜는 1/1/1753 오전 12:00:00 ~ 12/31/9999 오후 11:59:59 사이여야 합니다.

따라서 1753년 1월 1일 이전에 삽입/업데이트할 경우 이 오류가 발생합니다.

DECLARE @d char(8)
SET @d = '06082020'    /* MMDDYYYY means June 8. 2020 */
SELECT CAST(FORMAT (CAST (@d AS INT), '##/##/####') as DATETIME)

반환된 결과는 DateTime으로 @d의 원래 날짜 문자열입니다.

언급URL : https://stackoverflow.com/questions/1509977/convert-varchar-into-datetime-in-sql-server

반응형