SQL Server에 날짜 시간을 삽입하는 SQL 쿼리


133

datetime아래의 SQL 쿼리를 사용하여 테이블 (SQL Server)에 값 을 삽입하고 싶습니다

insert into table1(approvaldate)values(18-06-12 10:34:09 AM);

그러나이 오류 메시지가 나타납니다. Incorrect syntax near '10'.

나는 따옴표와 함께 그것을 시도

insert into table1(approvaldate)values('18-06-12 10:34:09 AM');

이 오류 메시지가 나타납니다 Cannot convert varchar to datetime

친절하게 도와주세요! 감사.

답변:


229

SQL Server에서 명확한 날짜 결정을 위해 YYYYMMDD를 사용하려고합니다.

insert into table1(approvaldate)values('20120618 10:34:09 AM');

dd-mm-yy hh:mm:ss xm형식 과 결혼 한 경우 특정 스타일과 함께 CONVERT를 사용해야합니다.

insert table1 (approvaldate)
       values (convert(datetime,'18-06-12 10:34:09 PM',5));

5여기 이탈리아 날짜 스타일이 있습니다. 글쎄, 이탈리아 인뿐만 아니라 그것이 Books Online 의 문화이기 때문 입니다.


1
고맙습니다. 작동합니다. Btw DD-MM-YY 형식으로 입력 할 수 없습니까?
Shee

@RichardTheKiwi 무엇을 5의미합니까?
Shee

@Shee는 대답에 바닥 글을 추가 참조
RichardTheKiwi

4
나는 당신이 대시를 사용 하지 않고YYYYMMDD HH:MM:SS (24 시간 형식-세계 형식, 미국을 제외하고는 군대를 제외하고 이것을 사용하는 경우) 언어 를 사용 하더라도 올바르게 작동 합니다. 그러나 사용 하면 실패합니다-이 경우 대시와 함께 날짜와 시간을 리터럴 로 분리 해야 합니다 . BritishYYYY-MM-DD HH:MM:SST
marc_s

1
@Shee SET DATEFORMAT문장을 살펴보십시오 . 개별 연결에 대한 설정이지만 서버 전체에서 설정을 지정할 수 있습니다. SET LANGUAGE기수 등에 사용되는 문자와 같은 것을 제어하도록 지정할 수도 있으며 날짜 형식은 그로부터 서버 또는 연결 수준에서 상속됩니다. 기본값은 미국 영어이고 mdy는 미국 형식입니다. 그러나 4 년 날짜의 ymd는 항상 작동합니다.
베이컨 비트

29

문자열 리터럴에 대한 언어 독립적 선택은 국제 표준 ISO 8601 형식 "YYYY-MM-DDThh : mm : ss"입니다. 아래 SQL 쿼리를 사용하여 형식을 테스트했으며 실제로 sys.syslanguages의 모든 SQL 언어에서 작동합니다 .

declare @sql nvarchar(4000)

declare @LangID smallint
declare @Alias sysname

declare @MaxLangID smallint
select @MaxLangID = max(langid) from sys.syslanguages

set @LangID = 0

while @LangID <= @MaxLangID
begin

    select @Alias = alias
    from sys.syslanguages
    where langid = @LangID

    if @Alias is not null
    begin

        begin try
            set @sql = N'declare @TestLang table (langdate datetime)
    set language ''' + @alias + N''';
    insert into @TestLang (langdate)
    values (''2012-06-18T10:34:09'')'
            print 'Testing ' + @Alias

            exec sp_executesql @sql
        end try
        begin catch
            print 'Error in language ' + @Alias
            print ERROR_MESSAGE()
        end catch
    end

    select @LangID = min(langid)
    from sys.syslanguages
    where langid > @LangID
end

Microsoft TechNet 의 문자열 리터럴 날짜 및 시간 형식 섹션에 따르면 표준 ANSI 표준 SQL 날짜 형식 "YYYY-MM-DD hh : mm : ss"는 "다국어"로되어 있습니다. 그러나 동일한 쿼리를 사용하면 ANSI 형식이 모든 SQL 언어에서 작동하지 않습니다.

예를 들어 덴마크어에서는 다음과 같은 많은 오류가 발생합니다.

언어 덴마크어 오류 varchar 데이터 형식을 datetime 데이터 형식으로 변환하면 범위를 벗어난 값이 발생했습니다.

SQL Server에서 실행하기 위해 C #으로 쿼리를 작성하고 ISO 8601 형식으로 날짜를 전달해야하는 경우 정렬 가능한 "s"형식 지정자를 사용하십시오 .

string.Format("select convert(datetime2, '{0:s}'", DateTime.Now);

YYYYMMDD날짜에만 사용할 수 있으며 YYYY-MM-DDThh:mm:ss(대시, 예, T날짜와 시간 부분 사이에!) 또는 YYYYMMDD HH:MM:SS(대시 없음, 분리 리터럴 없음) 언어와 독립적으로 사용할 수 있습니다 ...
marc_s

1
@marc_s : 의견 감사합니다. ISO 8601 형식을 언급하도록 답변을 편집했습니다 (이것은 언급 한대로 T 리터럴을 포함합니다).
Paul Williams

@TestLang (langdate) 값에 삽입하는 것이 가장 좋습니다 ( '2012-06-18T10 : 34 : 09').
MERT DOĞAN

20

Management Studio는 다음과 같은 스크립트를 만듭니다.

insert table1 (foodate) values(CAST(N'2012-06-18 10:34:09.000' AS DateTime))

8

당신은 그것을 추가해야합니다

insert into table1(date1) values('12-mar-2013');

2

변환을 사용할 필요가 없습니다. 간단히 ISO 8601 형식으로 인용 날짜로 표시하십시오.
이렇게 :

select * from table1 where somedate between '2000/01/01' and '2099/12/31'

구분 기호는 a /여야하며 작은 '따옴표로 묶어야합니다.


1

프로그래밍 언어를 통해 값을 저장하는 경우

다음은 C #의 예입니다.

날짜를 저장하려면 먼저 변환 한 다음 저장해야합니다

insert table1 (foodate)
   values (FooDate.ToString("MM/dd/yyyy"));

FooDate는 날짜 형식으로 날짜를 포함하는 날짜 / 시간 변수입니다.


1

더 일반적인 문제가 발생합니다. 다른 날짜 시간 형식을 가져 와서 날짜 시간 열에 삽입하십시오. 마지막으로 스칼라 함수가 된이 문을 사용하여 문제를 해결했습니다 (ODBC 표준, 미국, ANSI 및 영국 \ 프랜차이즈 날짜 스타일과 관련이 있습니다-확장 가능).

insert into <tableName>(<dateTime column>) values(coalesce 
(TRY_CONVERT(datetime, <DateString, 121), TRY_CONVERT(datetime, <DateString>, 
101), TRY_CONVERT(datetime, <DateString>, 102), TRY_CONVERT(datetime, 
<DateString>, 103))) 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.