SQL-Abfrage zum Einfügen von Datum und Uhrzeit in SQL Server


133

Ich möchte einen datetimeWert mit der folgenden SQL-Abfrage in eine Tabelle (SQL Server) einfügen

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

Aber ich bekomme diese Fehlermeldung. Incorrect syntax near '10'.

Ich habe es mit den Zitaten versucht

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

Ich erhalte diese Fehlermeldung Cannot convert varchar to datetime

Freundlich helfen! Vielen Dank.

Antworten:


229

Sie möchten das JJJJMMTT zur eindeutigen 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 xmFormat verheiratet sind, müssen Sie CONVERT mit dem spezifischen Stil verwenden.

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

5Hier ist der Stil für italienische Datteln. Nun, nicht nur Italiener, sondern diese Kultur wird auch in Books Online zugeschrieben .


1
Danke .. Es funktioniert. Übrigens ist eine Eingabe im Format TT-MM-JJ nicht möglich?
Shee

@ RichardTheKiwi was bedeutet das 5?
Shee

@ Shee siehe zusätzliche Fußzeile zu beantworten
RichardTheKiwi

4
Ich stehe korrigiert da - wenn Sie YYYYMMDD HH:MM:SS(im 24-Stunden-Format - das Weltformat, jeder außer den USA verwendet dies, nicht nur das Militär ...) ohne die Bindestriche verwenden - es funktioniert sogar für die BritishSprache. Wenn Sie YYYY-MM-DD HH:MM:SSjedoch scheitert es - in diesem Fall (die Striche), Sie müssen mit einem getrennten Datum und Uhrzeit Twörtlich zu nehmen .
marc_s

1
@ Shee Schauen Sie sich die SET DATEFORMATAussage an . Dies ist die Einstellung für eine einzelne Verbindung, die Einstellung kann jedoch serverweit festgelegt werden. Sie können auch angeben SET LANGUAGE, um beispielsweise zu steuern, welches Zeichen für den Radix und dergleichen verwendet wird, und das Datumsformat wird davon erben (wiederum auf Server- oder Verbindungsebene). Es ist nur so, dass der Standard US-Englisch ist und mdy das US-Format ist. ymd mit 4-Jahres-Daten funktioniert jedoch immer.
Bacon Bits

29

Eine sprachunabhängigere Wahl für String-Literale ist der internationale Standard ISO 8601 "JJJJ-MM-TTThh: mm: ss". Ich habe die folgende SQL-Abfrage verwendet, um das Format zu testen, und es funktioniert tatsächlich in allen SQL-Sprachen in 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-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

Gemäß dem Abschnitt Datums- und Zeitformate für Zeichenfolgenliterale in Microsoft TechNet soll das Standard-SQL-Datumsformat "JJJJ-MM-TT hh: mm: ss" des ANSI-Standards "mehrsprachig" sein. Bei Verwendung derselben Abfrage funktioniert das ANSI-Format jedoch nicht in allen SQL-Sprachen.

Auf Dänisch werden beispielsweise viele Fehler wie die folgenden auftreten:

Sprachfehler Dänisch Die Konvertierung eines Varchar-Datentyps in einen Datetime-Datentyp führte zu einem Wert außerhalb des Bereichs.

Wenn Sie eine Abfrage in C # erstellen möchten, die auf SQL Server ausgeführt werden soll, und ein Datum im ISO 8601-Format übergeben müssen, verwenden Sie den Formatbezeichner "s" von Sortable :

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

Scheint, Sie können YYYYMMDDnur für Datum verwenden, und entweder YYYY-MM-DDThh:mm:ss(mit Bindestrichen und ja, ein Teil Tzwischen Datum und Uhrzeit!) Oder YYYYMMDD HH:MM:SS(keine Bindestriche, kein Trennungsliteral), um wirklich
sprachunabhängig

1
@marc_s: Danke für den Kommentar. Ich habe meine Antwort bearbeitet, um das ISO 8601-Format zu erwähnen (das das von Ihnen erwähnte T-Literal enthält).
Paul Williams

Einfügen in @ TestLang (langdate) -Werte ('2012-06-18T10: 34: 09') ist die beste Antwort.
MERT DOĞAN

20

Management Studio erstellt Skripte wie:

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

8

Sie müssen es wie hinzufügen

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

2

Konvertierung ist nicht erforderlich. Listen Sie es einfach als angegebenes Datum im ISO 8601-Format auf.
Wie so:

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

Das Trennzeichen muss a sein /und von einfachen 'Anführungszeichen umgeben sein.


1

Wenn Sie Werte über eine beliebige Programmiersprache speichern

Hier ist ein Beispiel in C #

Um das Datum zu speichern, müssen Sie es zuerst konvertieren und dann speichern

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

FooDate ist eine datetime-Variable, die Ihr Datum in Ihrem Format enthält.


1

Ich stoße auf ein allgemeineres Problem: verschiedene (und nicht unbedingt bekannte) Datetime-Formate abzurufen und in die Datetime-Spalte einzufügen. Ich habe es mit dieser Aussage gelöst, die schließlich zu einer Skalarfunktion wurde (relevant für den kanonischen, amerikanischen, ANSI- und britischen \ franch-Datumsstil von ODBC - 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))) 
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.