2012-10-18 24 views
81

Ich mag einen datetime Wert in eine Tabelle (SQL Server) zum Einfügen mit der SQL-Abfrage unterSQL-Abfrage Datetime in SQL Server einfügen

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

Aber ich bekomme diese Fehler msg. Incorrect syntax near '10'.

Ich versuchte es mit Anführungszeichen

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

ich diese Fehlermeldung Cannot convert varchar to datetime

Bitte helfen bekommen! Danke.

Antwort

147

Sie möchten das JJJJMMTT für die eindeutige Datumsbestimmung in SQL Server verwenden.

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

Wenn Sie mit dem dd-mm-yy hh:mm:ss xm Format verheiratet sind, müssen Sie mit dem spezifischen Stil verwenden konvertieren.

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

5 hier ist der Stil für italienische Daten. Nun, nicht nur Italiener, aber das ist die Kultur, der es in Books Online zugeschrieben wird.

+1

Danke .. Es funktioniert. Btw ist es nicht möglich, im DD-MM-YY Format einzugeben? – Shee

+0

@RichardTheKiwi was bedeutet "5"? – Shee

+0

@Shee siehe Fußzeile zu beantworten – RichardTheKiwi

18

Siehe Abschnitt String Literal Date and Time Formats im Microsoft TechNet.

Sie können das Standard-ANSI-Standard-SQL-Datumsformat verwenden. Laut dem obigen Link ist es als "mehrsprachig" gekennzeichnet:

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

Dies wird jedoch nicht in allen Sprachen funktionieren. Zum Beispiel, hier ist eine schnelle Skript, die dynamische SQL verwendet ein Datumsformat in allen SQL-Sprachen in sys.syslanguages definiert zu testen:

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 

Wenn Sie dieses Skript ausführen, werden Sie viele Fehler wie folgt aus:

Fehler in der Sprache Dänisch Die Konvertierung eines Varchar-Datentyps in einen Datetime-Datentyp ergab einen Wert außerhalb des Bereichs.

Eine sprachunabhängige Option für Stringliterale ist der internationale Standard ISO 8601. Dieses Format ist sehr ähnlich zu dem ANSI-Standard mit Ausnahme eines „T“ wörtlichen zwischen dem Datum und Uhrzeit:

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

ich dies getestet, und es ist in der Tat in allen SQL-Sprachen zu arbeiten.

+0

Scheint, Sie können 'YYYYMMDD' nur für das Datum verwenden, und entweder' YYYY-MM-DDThh: mm: ss' (mit Bindestriche, und ja, ein "T" zwischen Datum und Zeit Teil!) oder "YYYYMMDD HH: MM: SS" (keine Bindestriche, keine Trennung Literal) zu wirklich sprachunabhängig ... –

+1

@marc_s: Vielen Dank für den Kommentar . Ich habe meine Antwort bearbeitet, um das ISO 8601-Format zu erwähnen (das das T-Literal enthält, wie Sie erwähnt haben). –

+1

Ein Skript zum Testen eines Datumsformats in allen Sprachen wurde hinzugefügt. –

1

Wenn Sie Sie Werte über einen beliebigen Programmiersprache

Hier ist ein Beispiel in C#

Zum Speichern von Datum werden zu speichern haben es zuerst zu konvertieren und sie dann speichern

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

FooDate Datumzeit ist Variable, die Ihr Datum in Ihrem Format enthält.

6

müssen Sie es wie Studio

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

Verwaltung hinzuzufügen schafft Skripte wie:

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

Keine Notwendigkeit konvertieren zu verwenden. Listen Sie es einfach als Zitatdatum im ISO 8601-Format auf. so
wie:

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

Der Separator ein / sein muss und es muss von einzelnen ' Anführungszeichen gesetzt werden.

1

Ich stoße auf ein allgemeineres Problem: verschiedene (und nicht unbedingt bekannte) Datetime-Formate zu bekommen und sie in die Datetime-Spalte einzufügen. Ich habe es löste diese Anweisung, die schließlich eine skalare Funktion wurde wurde (relevant für ODBC kanonisch, amerikanische, ANSI und britische \ franch date style - kann erweitert werden):

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