2012-10-18 16 views
81

Chcę wstawić wartość do tabeli (SQL Server) datetime za pomocą zapytania SQL poniżejzapytań SQL do wstawiania datetime w SQL Server

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

Ale ten błąd wiad. Incorrect syntax near '10'.

Próbowałem go z cytatami

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

dostaję ten komunikat o błędzie Cannot convert varchar to datetime

Prosimy o pomoc! Dzięki.

Odpowiedz

147

Będziesz chciał użyć YYYYMMDD do jednoznacznego określania daty w SQL Server.

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

Jeśli jesteś żonaty do formatu dd-mm-yy hh:mm:ss xm, trzeba będzie użyć CONVERT ze specyficznym stylu.

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

5 tutaj jest styl dla dat włoskich. Cóż, nie tylko Włosi, ale to kultura, którą przypisuje się w Books Online.

+1

Dziękuję .. To działa. Przy okazji nie można wprowadzić formatu DD-MM-RR? – Shee

+0

@RichardTheKiwi co oznacza '5'? – Shee

+0

@See zobaczył dodaną stopkę, aby odpowiedzieć na – RichardTheKiwi

18

Zobacz sekcję String Literal Date and Time Formats w witrynie Microsoft TechNet.

Można użyć standardowego formatu daty standardowej ANSI ANSI. Zgodnie z powyższym linkiem jest oznaczony jako "wielojęzyczny":

insert into table1(approvaldate) values ('2012-06-18 10:34:09') 

Nie będzie to jednak działać we wszystkich językach. Na przykład o to szybkie skrypt, który wykorzystuje dynamiczny SQL, aby sprawdzić format daty we wszystkich językach SQL określonych w sys.syslanguages:

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-18 10: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 

Po uruchomieniu tego skryptu, to będzie wiele błędów, jak następuje:

Błąd w języku duńskim Konwersja typu danych varchar na typ danych datetime spowodowała przekroczenie zakresu wartości.

Innym językowo niezależnym wyborem literałów ciągów jest międzynarodowy standard formatu ISO 8601. Format ten jest bardzo podobny do standardu ANSI wyjątkiem „T” dosłownym pomiędzy datą i godziną:

insert into @TestLang (langdate) values ('2012-06-18T10:34:09') 

testowałem to i to rzeczywiście działa we wszystkich językach SQL.

+0

Wygląda na to, że możesz użyć 'YYYYMMDD' tylko dla daty i albo' RRRR-MM-DDThh: mm: ss' (z myślniki, i tak, 'T' między porą dnia i czasu!) lub' RRRRMMDD GG: MM: SS' (bez kresek, bez literału separacyjnego), aby być prawdziwie niezależnym językiem ... –

+1

@marc_s: Dziękuję za komentarz . Zmieniłem moją odpowiedź, aby wspomnieć o formacie ISO 8601 (który zawiera literę T, o której wspomniałeś). –

+1

Dodano skrypt do przetestowania formatu daty we wszystkich językach. –

1

Jeśli przechowywania wartości za pomocą dowolnego języka programowania

Oto przykład w języku C#

Do tej pory sklepu trzeba konwertować go, a następnie zapisać go

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

FooDate jest datetime zmienna zawierająca datę w twoim formacie.

6

trzeba dodać ją jak

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

Management Studio tworzy skrypty jak:

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

Nie trzeba używać przeliczyć. Po prostu wpisz go jako datę cytowaną w formacie ISO 8601.
tak:

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

Separator musi być / i musi być otoczony pojedynczymi ' cytatów.

1

Mam do czynienia z bardziej ogólnym problemem: uzyskiwanie różnych (i niekoniecznie znanych) formatów datetime i wstawianie ich do kolumny datetime. Mam rozwiązać go za pomocą tego komunikatu, który ostatecznie stał się funkcję skalarną (dotyczy ODBC kanonicznym, amerykański, brytyjski ANSI i data \ FRANCH stylu - może zostać rozszerzona):

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)))