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


87

내 데이터 유형 값을에서 varchar으로 변환하기 위해 SQL을 실행할 때 다음 오류가 발생 했습니다 datetime.

Msg 242, 수준 16, 상태 3, 줄 1 varchar 데이터 형식을 datetime 데이터 형식으로 변환하면 값이 범위를 벗어났습니다.

데이터를 확인했는데 이상한 것이 보이지 않습니다. 다음 확인을 실행했는데 모두 결과가 반환되지 않았습니다.

SELECT [Date] from table where [DATe] is null
SELECT [Date] from table where [DATe] = ''
SELECT [Date] from table where LEN([date])> 10
SELECT [Date] from table where LEN([date])< 10
SELECT top 100 [Date] , SUBSTRING([date],4,2) from [table where convert(int, SUBSTRING([date],4,2)) < 1 or convert(int, SUBSTRING([date],4,2)) > 12
SELECT top 100 [Date] , SUBSTRING([date],1,2) from table where convert(int, SUBSTRING([date],4,2)) < 1 or convert(int, SUBSTRING([date],4,2)) > 31

이 문제에 대해 살펴볼 가치가 있고 조언이나 도움이 될만한 다른 것이 있습니까? 그것의 바닥을 얻을 수 없습니다.


3
날짜 열의 데이터 유형은 무엇입니까? 테이블 스키마와 오류가 발생했다는 설명을 보여 주시겠습니까?
Spikeh

3
제공 한 6 개의 SQL 문 중 어떤 것이 실패합니까?
Mureinik

1
6 개 문은 모두 작동하며 데이터에 문제가 없음을 확인합니다.
user23495 dec

3
유효하지 않은 날짜 (예 : 2013-10-31 또는 2013-02-30)를 확인하지 않았습니다. 아마도 당신이 직면 한 오류는 그런 종류의 문제가있는 날짜를 의미합니다
Dalen dec

2
안녕하세요 Dalen,이 확인을했습니다. 데이터 설정 방법은 2013/10/31, 2013/10/30입니다. 영국 형식입니다. 열 유형을 변경하려고 할 때 이것이 영향을 미칠 것이라고 생각하지 않았습니까?
user23495

답변:


84

나는 일주일 전에 같은 문제에 직면했다. 문제는 시간대 설정에 있습니다. mm / dd / yyyy와 같은 다른 형식으로 지정합니다 (일반적으로 작동 함).

날짜를 201312 월 30 일로 지정하면 오류가 발생했습니다. 그러나 mm / dd / yyyy 형식으로 지정하면 작동했습니다.

입력을 변환해야하는 경우 방법을 살펴볼 수 있습니다 CONVERT. 구문은

CONVERT(VARCHAR,@your_date_Value,103)

CONVERT(VARCHAR, '12/30/2013', 103)

마무리 103 은 날짜 시간 형식입니다.

변환 형식 및 추가 정보는이 링크를 참조하십시오. https://www.w3schools.com/sql/func_sqlserver_convert.asp


1
도움을 주셔서 감사합니다. 나는 이것을 변환하려고했지만 여전히 운이 없습니다. 테이블이 여전히 varchar이기 때문일 수 있습니까?
user23495 dec

2
표에있는 샘플 데이터를 게시하면 많은 도움이 될 것입니다. 의견에서 yyyy-mm-dd 형식으로 원한다고 말했습니다. 그래서 이것을 시도하십시오 SELECT CONVERT(char(10), GetDate(),126). GETDATE () 를 필요한 값으로 바꾸십시오 .
Mahe

60

나는 어리석은 실수 로이 문제를 만났습니다. 날짜가 실제로 존재하는지 확인하십시오!

예를 들면 :

2015 년 9 월 31 일이 존재하지 않습니다.

EXEC dbo.SearchByDateRange @Start = '20150901' , @End = '20150931'

따라서 이것은 메시지와 함께 실패합니다.

Error converting data type varchar to datetime.

이를 수정하려면 유효한 날짜를 입력하십시오.

EXEC dbo.SearchByDateRange @Start = '20150901' , @End = '20150930'

그리고 그것은 잘 실행됩니다.


2
예, 작업해야하는 데이터베이스에서 2015 년 2 월 29 일의 만료 날짜를 방금 찾았습니다. 어떻게 들어 갔는지 궁금합니다. 거기에 얼마나 더 많이 있는지 궁금합니다 ...
Resource

4
방금 cast (SUBSTRING ([MyDateField], 1,2)를 정수로)> 31을 사용하고 12 월 60 일의 기록을 찾았습니다. 누가이 물건을 입력합니까, Dr Suess?
SteveCav

3
감사! 이것은 내 문제였습니다. 내 세트에 잘못된 데이터가 있습니다-01/01/1113, haha.
Sev09

2
나를 위해 SQL 문을 작성하기 위해 날짜를 형식화 할 때 잘못된 형식 문자열을 넣었습니다. 내가 사용했다 Format(DateTime.Now, "yyyymmdd")가 있었어야 할 때Format(DateTime.Now, "yyyyMMdd")
제이 Imerman

1
Argh 미국 날짜 규칙! "2017 년 10 월 26 일", 즉 '26 -10-2017 '이 완벽하게 유효한 날짜이기 때문에 잠시 당혹 스러웠습니다. :)
Antimony

29

최근에 비슷한 문제가 발생했습니다. 지역 설정은 앱과 데이터베이스 서버 모두에서 올바르게 설정되었습니다. 그러나 SQL 실행 결과

"varchar 데이터 유형을 datetime 데이터 유형으로 변환하면 값이 범위를 벗어났습니다."

문제는 db 사용자의 기본 언어였습니다.

SSMS에서 확인하거나 변경하려면 보안-> 로그인으로 이동하고 쿼리를 실행하는 사용자의 사용자 이름을 마우스 오른쪽 버튼으로 클릭합니다. 속성-> 일반을 선택하고 대화 상자 하단의 기본 언어가 예상 한 언어인지 확인합니다.

쿼리를 실행하는 모든 사용자에 대해이 작업을 반복합니다.


1
이것은 나를 도왔다. 약간의 수정 : server loginnot의 기본 언어입니다 db user. top-password.com/blog/...
바즈 Guvenkaya에게

1
프로그램 코드에 설정되어 있고 코드에 액세스 할 수 없었기 때문에에서 English로 변경하여 British English작동했습니다!
vaheeds

1
영어를 영국식 영어로 바꾸는 것도 저도 마찬가지입니다. Ali, 당신은 생명의 은인입니다!
david-giorgi


4
Create procedure [dbo].[a]

@examdate varchar(10) ,
@examdate1 varchar(10)
AS
Select tbl.sno,mark,subject1,
Convert(varchar(10),examdate,103) from tbl
where 
(Convert(datetime,examdate,103)  >= Convert(datetime,@examdate,103) 
and (Convert(datetime,examdate,103) <=  Convert(datetime,@examdate1,103)))

5
답변에 더 많은 설명을 추가하십시오. 질문자가 귀하의 답변에서 더 많은 것을 파악하는 데 도움이 될 것입니다.
Pramod S. Nikam

2

동일한 문제가 발생했으며 SQL Server가 동일한 방식으로 정수로 변환 된 문자에 대해 비교를 수행하지 않기 때문에이 문제가 발생한다고 결정했습니다. 내 테스트에서 느낌표와 같은 변환 된 문자의 일부 비교는 형식 변환 오류를 반환하는 반면 공백과 같은 변환 된 문자의 다른 비교는 범위를 벗어난 것으로 확인됩니다.

이 샘플 코드는 가능한 다양한 시나리오를 테스트하고 중첩 된 REPLACE 문을 사용하는 솔루션을 제공합니다. REPLACE는 문자열에 숫자 나 슬래시가 아닌 문자가 있는지 확인하고, 존재하는 경우 문자열 길이가 0보다 길어 '잘못된'문자가 있고 날짜가 유효하지 않음을 나타냅니다. .

DECLARE @str varchar(10)
SET @str = '12/10/2012'
IF convert(int, substring(@str,4,2)) <= 31 AND convert(int, substring(@str,4,2)) >= 1
    PRINT @str+': Passed Test'
    ELSE PRINT @str+': Failed Test'
GO

DECLARE @str varchar(10)
SET @str = '12/10/2012' 
PRINT 'Number of characters in ' + @str + ' that are not numerals or a slash (0 means the date is valid; all values greater than 0 indicate a problem): ' + convert(varchar(5),len(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(@str,'0',''),'1',''),'2',''),'3',''),'4',''),'5',''),'6',''),'7',''), '8',''),'9',''),'/',''),' ','+'))) --replace space with a + to avoid empty string
PRINT ''
GO

DECLARE @str varchar(10)
SET @str = '12/!0/2012'
    IF convert(int, substring(@str,4,2)) <= 31 AND convert(int, substring(@str,4,2)) >= 1
        PRINT @str+': Passed Test'
        ELSE PRINT @str+': Failed Test'
GO

DECLARE @str varchar(10)
SET @str = '12/!0/2012' 
PRINT 'Number of characters in ' + @str + ' that are not numerals or a slash (0 means the date is valid; all values greater than 0 indicate a problem): ' + convert(varchar(5),len(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(@str,'0',''),'1',''),'2',''),'3',''),'4',''),'5',''),'6',''),'7',''), '8',''),'9',''),'/',''),' ','+'))) --replace space with a + to avoid empty string
PRINT ''
GO

DECLARE @str varchar(10)
SET @str = '12/  /2012'
IF convert(int, substring(@str,4,2)) <= 31 AND convert(int, substring(@str,4,2)) >= 1
    PRINT @str+': Passed Test'
    ELSE PRINT @str+': Failed Test'
GO

DECLARE @str varchar(10)
SET @str = '12/  /2012' 
PRINT 'Number of characters in ' + @str + ' that are not numerals or a slash (0 means the date is valid; all values greater than 0 indicate a problem): ' + convert(varchar(5),len(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(@str,'0',''),'1',''),'2',''),'3',''),'4',''),'5',''),'6',''),'7',''), '8',''),'9',''),'/',''),' ','+'))) --replace space with a + to avoid empty string

산출:

--Output
--12/10/2012: Passed Test
--Number of characters in 12/10/2012 that are not numerals or a slash (0 means the date is valid; all values greater than 0 indicate a problem): 0

--Msg 245, Level 16, State 1, Line 4
--Conversion failed when converting the varchar value '!0' to data type int.
--Number of characters in 12/!0/2012 that are not numerals or a slash (0 means the date is valid; all values greater than 0 indicate a problem): 1

--12/  /2012: Failed Test
--Number of characters in 12/  /2012 that are not numerals or a slash (0 means the date is valid; all values greater than 0 indicate a problem): 2

2
+ this happens because sql sometimes doesn't recognize dd/mm/yyyy format
+ so we should always check if the input string is a valid date or not and the accordingly convert it to mm/dd/yyyy and so , i have shown below how it can be done, i have created a function to rearrange in mm/dd/yyyy from dd/mm/yyyy

select case when isdate('yourdate')=1 then CAST('yourdate' AS datetime) 
  else (select * from dbo.fn_convertdate(yourdate))

Create function dbo.fn_convertdate( @Stringdate nvarchar(29))
RETURNS @output TABLE(splitdata NVARCHAR(MAX) 
)
Begin
Declare @table table(id int identity(1,1), data varchar(255))
Declare @firstpart nvarchar(255)
Declare @tableout table(id int identity(1,1), data varchar(255))

Declare @Secondpart nvarchar(255)
Declare @Thirdpart nvarchar(255)

declare @date datetime

insert into @table
select * from dbo.fnSplitString(@Stringdate,'/')
select @firstpart=data from @table where id=2
select @Secondpart=data from @table where id=1
select @Thirdpart=data from @table where id=3
set @date=@firstpart+'/'+@Secondpart+'/'+@Thirdpart
insert into @output(splitdata) values(
@date)


return
End

날짜 문자열 '19610010'(형식 : YYYYMMDD)이있는 문제가있는 행으로 인해 'nvarchar 데이터 형식을 datetime 데이터 형식으로 변환하면 범위를 벗어난 값'오류가 발생했습니다. SELECT CONVERT (datetime, 'yourdate') FROM [yourtable] WHERE ISDATE ( 'yourdate') = 1 저장 날짜 :)
J Pollack

2

sysdate를 열에 자동 삽입하는 동안이 문제가 발생했습니다.

내가 한 일은 SQL 서버의 날짜 형식과 일치하도록 시스템 날짜 형식을 변경 한 것입니다. 예를 들어 내 SQL 형식은 mm / dd / yyyy이고 시스템 형식은 dd / mm / yyyy로 설정되었습니다. 시스템 형식을 mm / dd / yyyy로 변경했는데 오류가 사라졌습니다.

-kb


2

아시다시피 이것은 영국 형식 문제입니다. 함수를 사용하여 간접적으로 날짜 변환을 할 수 있습니다.

CREATE FUNCTION  ChangeDateFormatFromUK
( 
   @DateColumn varchar(10)
)

RETURNS VARCHAR(10)
AS 
 BEGIN
    DECLARE @Year varchar(4), @Month varchar(2), @Day varchar(2), @Result varchar(10)
    SET @Year = (SELECT substring(@DateColumn,7,10))
    SET @Month = (SELECT substring(@DateColumn,4,5)) 
    SET @Day = (SELECT substring(@DateColumn,1,2))
   SET @Result  = @Year  + '/' @Month + '/' +  @Day

 RETURN @Result
END

이 함수를 호출하려면

SELECT dbo.ChangeDateFormatFromUK([dates]) from table

일반적으로 datetime으로 변환

SELECT CONVERT(DATETIME,dbo.ChangeDateFormatFromUK([dates])) from table

귀하의 경우에는 할 수 있습니다.

SELECT [dates] from table where CONVERT(DATETIME,dbo.ChangeDateFormatFromUK([dates])) > GetDate()   -- or any date

2

2079 년을 초과하는 해에 대한 테스트. 사용자가 2016 년 (10/12/2106) 대신 2106을 입력하고 붐을 일으킨다는 사실을 발견했습니다. 그래서 2016 년 10 월 12 일에 테스트 한 결과 SQL Server가 최대 2078 년까지 허용되는 것으로 나타 났으며, 연도가 2079 년 이상이면 해당 오류가 발생하기 시작했습니다. SQL Server가 어떤 종류의 날짜를 슬라이딩하는지에 대해서는 더 이상 조사하지 않았습니다.


1

먼저 새 테이블 (DateTime 파일 포함)로 변환하려는 varchar 필드를 DateTime 호환 레이아웃으로 변환 한 다음 SQL은 문제없이 varchar에서 DateTime으로 변환합니다.

아래에서 (그 이름으로 만든 테이블이 아닙니다!) 원하는 경우 varchar 필드를 DateTime과 비슷하게 만듭니다.

update report1455062507424 
set [Move Time] = substring([Move Time], 7, 4) + '-'+ substring([Move Time], 4, 2) + '-'+ substring([Move Time], 1, 2) + ' ' + 
    substring([Move Time], 12, 5)  

1
Varchar Date Convert to Date and Change the Format

Nov 12 2016 12:00, 21/12/2016, 21-12-2016 this Query Works for above to change to this Format dd / MM / yyyy SELECT [Member_ID],[Name] , Convert(varchar(50),Convert(date,[DOB],103),103) as DOB ,[NICNO],[Relation] FROM [dbo].[tbl_FamilMember]


0

이 오류는 C # 코드에서 직접 인라인 쿼리를 사용하여 열에 최소 날짜와 시간을 저장하려고했기 때문에 발생했습니다.

날짜 변수는 코드에서 01/01/0001 12:00:00 AM으로 설정되었는데, 그렇지 않으면 C #의 DateTime이이 날짜와 시간으로 초기화된다는 사실을 감안하면 그렇지 않습니다. MS-SQL 2008 datetime 데이터 유형에 허용되는 최소 날짜는 1753-01-01 12:00:00 AM입니다.

코드에서 날짜를 변경하고 1900 년 1 월 1 일로 설정했는데 더 이상 오류가보고되지 않았습니다.


0

MM 대신 mm로 날짜에 ToString ()을 사용했습니다.


0

날짜가 호환되는지 또는 데이터베이스 관리자 (예 : SQL Server Management Studio)에서 제대로 실행될 수 있는지 확인하십시오. 예를 들어, DateTime.Now C # 함수는 SQL 서버에서 유효하지 않습니다. 즉, 쿼리에 SQL Server 용 GETDATE ()와 같은 유효한 함수가 포함되어야합니다.

이 변화는 저에게 완벽하게 작동했습니다.


0

이 문제에 대한 약간 비정상적인 원인이지만 누군가가 필요로 할 경우를 대비합니다. 내가 작업하고 있던 코드는 다음을 사용했습니다.

java.text.DateFormat.getDateTimeInstance()

날짜 포맷터를 얻으려면. 이 호출에서 반환 된 형식 지정 패턴은이 버그 보고서에 설명 된대로 Java 8에서 Java 9로 변경되었습니다. https://bugs.openjdk.java.net/browse/JDK-8152154 분명히 반환 된 형식이 적합하지 않았습니다. 데이터베이스. 대신 해결책은 다음과 같습니다.

DateTimeFormatter.ISO_LOCAL_DATE_TIME
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.