datetime을 삽입하는 동안 문자열에서 날짜 및 / 또는 시간을 변환 할 때 변환에 실패했습니다


164

다음과 같이 테이블을 만들려고했습니다.

create table table1(date1 datetime,date2 datetime);

먼저 아래와 같이 값을 삽입하려고했습니다.

insert into table1 values('21-02-2012 6:10:00 PM','01-01-2001 12:00:00 AM');

오류가 발생했습니다.

varchar를 datetime으로 변환 할 수 없습니다

그런 다음 stackoverflow에서 제안한 게시물 중 하나로 아래 형식을 시도했습니다.

insert into table1 values(convert(datetime,'21-02-2012 6:10:00 PM',5)
                          ,convert(datetime,'01-01-2001 12:00:00 AM',5));

그러나 여전히 오류가 발생합니다.

문자열에서 날짜 및 / 또는 시간을 변환 할 때 변환에 실패했습니다

어떤 제안?


2
@Damien_The_Unbeliever 당신이 말했듯 이이 질문을하기 전에이 게시물을 이미 참조했습니다 stackoverflow.com/questions/12957635/… 그들은 'insert table1 (approvaldate) 값을 사용하도록 요청했습니다 (convert (datetime, '18 -06-12 10:34:09 PM', 5)); ' 하지만 작동하지 않습니다
Mari

답변:


163

SQL Server에서 지원하는 형식은 여러 가지가 있습니다 . CAST 및 CONVERT에 대한 MSDN 온라인 설명서를 참조하십시오 . 이러한 형식의 대부분은 어떤 설정을 사용 하느냐에 따라 달라 지므로 이러한 설정은 때때로 작동 할 수도 있고 그렇지 않을 수도 있습니다.

이를 해결하는 방법 은 SQL Server에서 지원 하는 (약간 적응 된) ISO-8601 날짜 형식을 사용 하는 것입니다.이 형식은 SQL Server 언어 및 날짜 형식 설정에 관계없이 항상 작동합니다 .

ISO-8601 형식 SQL Server에서 지원되는 두 가지 유형이있다 :

  • YYYYMMDD단지 날짜 (시간 부분 없음); 여기에주의하십시오 : 대시 없음! 매우 중요합니다! YYYY-MM-DD이다 NOT 당신의 SQL Server에서 DATEFORMAT 설정의 독립적 인 것 NOT 모든 상황에서 작동!

또는:

  • YYYY-MM-DDTHH:MM:SS날짜 및 시간-참고 :이 형식 에는 대시가 있지만 생략 할 있으며 T의 날짜와 시간 부분을 구분 기호 로 고정 합니다 DATETIME.

이것은 SQL Server 2000 이상에서 유효합니다.

구체적인 경우에는 다음 문자열을 사용하십시오.

insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00');

주의를 기울여야합니다 (참고 : 12 시간 AM / PM 형식 대신 24 시간 국제 형식 을 사용해야합니다 ).

또는 SQL Server 2008 이상을 사용하는 경우 DATETIME2일반 대신 데이터 유형을 사용할 수 있으며 DATETIME현재 INSERT는 문제없이 작동합니다! :-) DATETIME2는 변환에서 훨씬 더 좋고 까다 롭지 않으며 SQL Server 2008 이상에서 권장되는 날짜 / 시간 데이터 형식입니다.

SELECT
   CAST('02-21-2012 6:10:00 PM' AS DATETIME2),     -- works just fine
   CAST('01-01-2012 12:00:00 AM' AS DATETIME2)   -- works just fine  

왜이 주제 전체가 그렇게 까다 롭고 다소 혼란 스러운지 묻지 마십시오. 그것이 바로 그 방식입니다. 그러나 YYYYMMDD형식을 사용하면 SQL Server의 모든 버전과 SQL Server의 모든 언어 및 날짜 형식 설정에 적합해야합니다.


1
참고로 DATETIME2로 캐스팅하면 'YYYY-MM-DDTHH : MM : SSZ'(주석 'Z'-UTC 시간 소인을 나타내는 줄 루어 시간) 와도 작동합니다. 날짜 시간 필드에 '2013-12-16T17 : 21 : 26Z'를 삽입하는 동안이 오류가 발생했습니다. 명확히하기 위해 ISO 8601이 부분적으로 지원됩니다. Zulu 시간은 문서에서 언급 되었음에도 불구하고 지원하지 않습니다. 아마 알아낼 시간이 없었던 설정 일지 모르지만 누군가 같은 문제가있는 경우 명심하십시오.
Michał

3
'YYYYMMDD'날짜 형식이 제대로 작동하는지 확인할 수 있으며 WHERE 절에 리터럴 날짜를 지정하는 방법으로 SQL Server 2014에서 시도했습니다. @marc_s에 많은 탱크
Giorgio Barchiesi

1
DATETIME2 일은 나를 위해 일했습니다. 필자의 경우 데이터베이스의 스크립트를 영어의 SQLServer에서 스페인어 버전으로 가져 와서 매번 동일한 오류가 발생했습니다. 스크립트에서 모든 "DATETIME"을 "DATETIME2"로 대체하고 문제를 해결했습니다.
Alejandro del Río

24

사용 된 날짜 또는 시간 형식으로 인해 SQL Server에서 변환이 실패하는 경우가 있습니다. 이는 시스템에서 허용 할 수없는 잘못된 데이터를 저장하려고하기 때문입니다.

예:

Create Table MyTable (MyDate);

Insert Into MyTable(MyDate) Values ('2015-02-29');

SQL Server는 다음 오류를 발생시킵니다.

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

이 오류의 원인은 연도 (2015)에 그러한 날짜 (2 월 29 일)가 없기 때문입니다.


2
"이 오류의 이유는 단순히 (2015 년)에 그러한 날짜 (2 월 29 일)가 없기 때문입니다." 이것이 바로이 오류가 발생한 이유입니다. 이 답변은이 오류의 가장 일반적인 원인을 고려하여 다른 답변은 그렇지 않습니다.
FirstFraktal

1
셀에 null 값이 실제로 "NULL"인 Excel 시트에서 데이터를 가져 왔습니다. DB 테이블에서 문자열 "Null"로 설정되었으므로 문자열 "Null"을 날짜 / 시간으로 변환하려고했습니다. Excel에서 "NULL"셀을 비웠어야합니다. 나는 바보입니다 : /
karol

17

간단한 답변-5는 이탈리아어 "yy"이고 105는 이탈리아어 "yyyy"입니다. 따라서:

SELECT convert(datetime,'21-02-12 6:10:00 PM',5)

제대로 작동하지만

SELECT convert(datetime,'21-02-12 6:10:00 PM',105)

오류가 발생합니다.

마찬가지로,

SELECT convert(datetime,'21-02-2012 6:10:00 PM',5)

오류가 발생합니다.

SELECT convert(datetime,'21-02-2012 6:10:00 PM',105)

작동합니다.


8

다음과 같이 날짜 형식을 업데이트하십시오.

yyyy-MM-dd hh:MM:ss

그것은 나를 위해 문제를 해결하고 잘 작동합니다


2
이미 제공된 다른 답변을 읽으십시오. 이 형식은 세션 DATEFORMAT설정으로 인해서 만 작동 합니다. 를 실행하여이를 확인하십시오 SET DATEFORMAT MDY;SELECT CAST('2017-08-07 00:00:00' AS datetime); SET DATEFORMAT DMY;SELECT CAST('2017-08-07 00:00:00' AS datetime);. T구분 기호 ( yyyy-MM-ddTHH:mm:ss) 를 추가하면 안정적으로 작동 합니다.
Dan Guzman

1
대단히 감사합니다. 네가 옳아 내 문제를 해결하고 여기에 주어진 다른 답변을 읽었습니다.
Pronab Roy

8

가능할 때마다 문화권 별 날짜 / 시간 리터럴을 피해야 합니다.

날짜 / 시간을 리터럴로 제공하는 몇 가지 보안 형식 이 있습니다 .

에 대한 모든 예 2016-09-15 17:30:00

ODBC ( 실제 유형으로 즉시 처리되므로 즐겨 찾기 )

  • {ts'2016-09-15 17:30:00'} -타임 스탬프
  • {d'2016-09-15'} -날짜 만
  • {t'17:30:00'} -시간 만

ISO8601 ( 어디서나 최고 )

  • '2016-09-15T17:30:00'- T중간에 유의 하십시오!

분리되지 않음 (숫자로 잘못 해석 될 수있는 작은 위험)

  • '20160915' - 순수한 날짜 에만

주의 사항 : 유효하지 않은 날짜는 이상한 오류 로 표시되는 경향이 있습니다.

  • 6 월 31 일 또는 2 월 30 일은 없습니다 ...

이상한 변환 오류가 발생하는 또 다른 이유 : 실행 순서!

SQL-Server는 예상치 못한 실행 순서로 작업을 수행하는 것으로 잘 알려져 있습니다. 귀하의 서면 진술은 일부 유형 관련 작업 이 수행 되기 전에 변환이 완료된 것처럼 보이지만 엔진은 이후 단계에서 변환을 수행하기로 결정합니다.

다음은 예제를 통해 설명하는 훌륭한 기사입니다. Rusano.com : "t-sql-functions-do-no-imply-a-certain-order-of-execution"관련 질문이 있습니다.


3

가장 좋은 방법은이 코드입니다

"select * from [table_1] where date between convert(date,'" + dateTimePicker1.Text + "',105) and convert(date,'" + dateTimePicker2.Text + "',105)"

2
convert(datetime2,((SUBSTRING( ISNULL(S2.FechaReal,e.ETA),7,4)+'-'+ SUBSTRING( ISNULL(S2.FechaReal,e.ETA),4,2)+'-'+ SUBSTRING( ISNULL(S2.FechaReal,e.ETA),1,2) + ' 12:00:00.127')))  as fecha,

1
초기 공백 대신 백틱을 사용하면 줄 바꿈이 발생합니다.
Z의 Jesse W-

2

실제로 SQL Server에서 실행되는 날짜 시간 형식은

yyyy-mm-dd hh:MM:ss

1
아니요, 이는 사실이 아닙니다 ( m및 의 불일치 제외 M). Pronab Roy의 답변에 대한 Dan Guzman의 의견을 읽으십시오. 그리고 다른 답변을 읽으십시오 ...
Shnugo

2

이것을 시도하십시오.

SQL Server는 MM / DD / YYYY 형식의 날짜를 예상합니다. 영어가 기본 언어로 설정된 경우 여기에 datepicker 값을 sql2008 데이터베이스에 저장합니다. 내 필드 유형은 datetime in database.dpdob는 내 datepicker 이름입니다.

           Dim test = dpdob.Text.Replace("-", "/")
           Dim parts As String() = test.Split(New Char() {"/"c})
           Dim firstPart As String = parts(0)
           Dim thirdPart As String = parts(2)
           Dim secondPart As String = parts(1)
           Dim test1 = secondPart + "/" + firstPart + "/" + thirdPart
           Dim dob = test1

이제 삽입 쿼리에서 dob를 사용하십시오.


1

이 코드를 사용해보십시오

select (Convert(Date, '2018-04-01'))

1

getdate()nvarchar 필드에 삽입하는 문자열 에 연결하려고 할 때이 문제가 발생했습니다 .

나는 그것을 해결하기 위해 캐스팅을했다.

 INSERT INTO [SYSTEM_TABLE] ([SYSTEM_PROP_TAG],[SYSTEM_PROP_VAL]) VALUES 
   (
    'EMAIL_HEADER',
    '<h2>111 Any St.<br />Anywhere, ST 11111</h2><br />' + 
        CAST(CAST(getdate() AS datetime2) AS nvarchar) + 
    '<br /><br /><br />'
   )

그것은 위생적인 ​​예입니다. 그 핵심 부분은 다음과 같습니다.

...' + CAST(CAST(getdate() AS datetime2) AS nvarchar) + '...

날짜를로 캐스팅 한 datetime2다음 nvarchar연결했습니다.


1

나는 이것을 시도했고 그것은 나와 함께 일하고있다 :

SELECT CONVERT(date, yourDate ,104)

0

web.config 파일에서 Culture를 영어로 설정

  <globalization uiCulture="en-US" culture="en-US" />

예를 들어 문화를 아랍어로 설정하면 도둑이

타코야끼 @Shana_Takoyomi 22:16:57 ص

datetime을 삽입하는 동안 문자열에서 날짜 및 / 또는 시간을 변환 할 때 변환에 실패했습니다



0

나를 위해 이것은 효과가 있었다 :

INSERT INTO [MyTable]
           ([ValidFrom]
           ,[ValidTo])
       VALUES
           ('2020-01-27 14:54:11.000'
           ,'2023-01-27 14:52:50.000')
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.