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.

Xaisoft
quelle
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:

152

Geben Sie im Zweifelsfall die Datentypkonvertierung mit CAST / CONVERT explizit an :

UPDATE TABLE
   SET EndDate = CAST('2009-05-25' AS DATETIME)
 WHERE Id = 1
OMG Ponys
quelle
1
Vielen Dank funktioniert gut in SQL Server 2016. Ich verwende nur Variablen und alles gesetzt.
PatsonLeaner
Ich habe das benutzt und die Zeit nach dem Datum hinzugefügt und es hat funktioniert
FernandoZ
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
Serkan Hekimoglu
quelle
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 ...

Remus Rusanu
quelle
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

Moe Sisko
quelle
5
UPDATE TABLE
   SET EndDate = CAST('2017-12-31' AS DATE)
 WHERE Id = '123'
Evgeny Sobolev
quelle
2

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

mikesl
quelle
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'

OriginalOcto
quelle
1

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

Gratzy
quelle
Ich werde es noch einmal überprüfen.
Xaisoft