Wie aktualisiere ich ein DateTime-Feld in T-SQL?


81

Die folgende Abfrage aktualisiert das Datum / Uhrzeit-Feld nicht:

update table
SET EndDate = '2009-05-25'
WHERE Id = 1

Ich habe es auch ohne Bindestriche versucht, aber das funktioniert auch nicht.


1
Ist Datum der tatsächliche Spaltenname?
Gratzy

1
Eigentlich ist es EndDate, aber ich habe es nur auf Date gekürzt.
Xaisoft

Erhalten Sie einen Fehler oder nur keine Ergebnisse?
Gratzy

Was ist der Datentyp für die EndDateSpalte?
OMG Ponys

Es heißt 1 Zeile betroffen, aber wenn ich überprüfe, hat sich das Datum nicht geändert.
Xaisoft

Antworten:



33

Normalerweise sollte es funktionieren.

Aber kannst du das versuchen? Ich habe kein SQL auf meinem Heim-PC, ich kann es nicht selbst versuchen

UPDATE table
SET EndDate = '2009-05-25 00:00:00.000'
WHERE Id = 1

1
Das hat funktioniert, aber ich habe es vorher ohne alle Nullen versucht und es hat nicht funktioniert. Warum?
Xaisoft

Ich habe es mit '2009-05-25 00: 02: 01.000' versucht, aber es hat nicht funktioniert.
Xaisoft

Schön, ernsthaft keine Ahnung. Weil Sie ohne Zeitinformationen geschrieben haben und SQL die Standardeinstellung 00: 00: 00.000 automatisch anhängen muss. Also muss es funktionieren.
Serkan Hekimoglu

11

Das Zeichenfolgenliteral wird gemäß der aktuellen Datumsformateinstellung verschoben, siehe SET DATEFORMAT. Ein Format, das immer funktioniert, ist das '20090525'.

Jetzt müssen Sie natürlich definieren, dass "nicht funktioniert". Keine Datensätze werden aktualisiert? Vielleicht Id=1passt das zu keinem Rekord ...

Wenn dort "Ein Datensatz geändert" steht, müssen Sie uns möglicherweise zeigen, wie Sie ...


Das Datumsformat ist der Grund, warum ich dachte, es wäre eine gute Idee, explizit über die Konvertierung zu sprechen ...
OMG Ponies

Gutes Zeug Remus, SET DATEFORMATist wirklich effektiv beim Schreiben von SQL für Umgebungen mit unterschiedlichen Lokalisierungen
Matt R

Genial! Dies hat bei mir funktioniert und mir einige Schritte erspart, da das Feld, das ich konvertiere, bereits dieses Format verwendet hat, dh, dass es nicht zuerst in ISO oder ein anderes Format konvertiert werden muss.
Roberto

8

Die Verwendung eines DateTime-Parameters ist der beste Weg. Wenn Sie jedoch weiterhin eine DateTime als Zeichenfolge übergeben möchten, sollte CAST nicht erforderlich sein, sofern ein sprachunabhängiges Format verwendet wird.

z.B

Gegeben eine Tabelle erstellt wie:

create table t1 (id int, EndDate DATETIME)
insert t1 (id, EndDate) values (1, GETDATE())

Folgendes sollte immer funktionieren:

update t1 set EndDate = '20100525' where id = 1 -- YYYYMMDD is language agnostic

Folgendes wird funktionieren:

SET LANGUAGE us_english
update t1 set EndDate = '2010-05-25' where id = 1

Dies wird jedoch nicht:

SET LANGUAGE british
update t1 set EndDate = '2010-05-25' where id = 1  

Dies liegt daran, dass 'JJJJ-MM-TT' kein sprachunabhängiges Format ist (aus Sicht des SQL Servers).

Das ISO-Format 'JJJJ-MM-TTThh: mm: ss' ist ebenfalls sprachunabhängig und nützlich, wenn Sie eine Zeit ungleich Null überschreiten müssen.

Weitere Informationen: http://karaszi.com/the-ultimate-guide-to-the-datetime-datatypes



2

Das sollte funktionieren, ich würde [Datum] in Klammern setzen, da es sich um ein reserviertes Schlüsselwort handelt.


2

Wenn Sie keine Zeit angeben möchten , können Sie auch das Format ' TT / MM / JJJJ ' verwenden. Ich würde mich jedoch an eine Konvertierungsmethode und das entsprechende ISO-Format halten, da Sie die Verwendung von Standardwerten wirklich vermeiden sollten.

Hier ist ein Beispiel:

SET startDate = CONVERT(datetime,'2015-03-11T23:59:59.000',126) WHERE custID = 'F24'


1

Gibt es vielleicht einen Auslöser auf dem Tisch, der ihn zurücksetzt?


Ich werde es noch einmal überprüfen.
Xaisoft
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.