Jak zaktualizować pole DateTime w T-SQL?

81

Następujące zapytanie nie aktualizuje pola daty i godziny:

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

Próbowałem też bez myślników, ale to też nie działa.

Xaisoft
źródło
1
czy data to rzeczywista nazwa kolumny?
Gratzy
1
nie właściwie, to EndDate, ale właśnie skróciłem go do Date.
Xaisoft
pojawia się błąd lub po prostu brak wyników?
Gratzy
Jaki jest typ danych w EndDatekolumnie?
Kucyki OMG
Mówi, że dotyczy to 1 wiersza, ale kiedy sprawdzam, data się nie zmieniła.
Xaisoft

Odpowiedzi:

33

Zwykle powinno działać.

Ale czy możesz tego spróbować? Nie mam SQL na moim domowym komputerze, nie mogę sam spróbować

UPDATE table
SET EndDate = '2009-05-25 00:00:00.000'
WHERE Id = 1
Serkan Hekimoglu
źródło
1
To zadziałało, ale próbowałem go wcześniej bez zer i nie zadziałało. Czemu?
Xaisoft
Wypróbowałem to z „2009-05-25 00: 02: 01.000”, ale nie zadziałało.
Xaisoft
Fajnie, poważnie nie mam pojęcia. Ponieważ pisałeś bez informacji o czasie, a SQL musi automatycznie dołączyć domyślny 00: 00: 00.000. Więc to musi działać.
Serkan Hekimoglu
11

Literał łańcuchowy jest przekazywany zgodnie z bieżącym ustawieniem formatu daty, patrz SET DATEFORMAT. Format, który zawsze będzie działał, to „20090525”.

Teraz oczywiście musisz zdefiniować „nie działa”. Żadne rekordy nie są aktualizowane? Być możeId=1 nie pasuje do żadnego rekordu ...

Jeśli wyświetla się komunikat „Zmieniono jeden rekord”, być może musisz nam pokazać, jak weryfikujesz ...

Remus Rusanu
źródło
Format daty jest powodem, dla którego myślałem, że wyraźne określenie konwersji byłoby dobrym pomysłem ...
OMG Kucyki
Dobra rzecz Remus, SET DATEFORMATjest naprawdę skuteczny podczas pisania SQL dla środowisk z różnymi lokalizacjami
Matt R
Niesamowite! To zadziałało dla mnie i zaoszczędziło mi kilku kroków, ponieważ pole, które konwertuję, już używało tego formatu, tj. Nie trzeba najpierw konwertować go na format ISO lub inny.
Roberto
8

Najlepszym sposobem jest użycie parametru DateTime. Jeśli jednak nadal chcesz przekazać DateTime jako ciąg, funkcja CAST nie powinna być konieczna, pod warunkiem, że używany jest format niezależny od języka.

na przykład

Biorąc pod uwagę tabelę utworzoną w następujący sposób:

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

Poniższe powinny zawsze działać:

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

Będzie działać:

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

Jednak to nie będzie:

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

Dzieje się tak, ponieważ „RRRR-MM-DD” nie jest formatem niezależnym od języka (z punktu widzenia serwera SQL).

Format ISO „RRRR-MM-DDTgg: mm: ss” jest również niezależny od języka i jest przydatny, gdy trzeba przejść przez czas niezerowy.

Więcej informacji: http://karaszi.com/the-ultimate-guide-to-the-datetime-datatypes

Moe Sisko
źródło
5
UPDATE TABLE
   SET EndDate = CAST('2017-12-31' AS DATE)
 WHERE Id = '123'
Evgeny Sobolev
źródło
2

To powinno zadziałać, umieściłbym nawiasy wokół [Date], ponieważ jest to zastrzeżone słowo kluczowe.

mikesl
źródło
2

Jeśli nie jesteś zainteresowany określaniem czasu, możesz również użyć formatu „ DD / MM / RRRR ”, jednak trzymałbym się metody konwersji i jej odpowiedniego formatu ISO, ponieważ naprawdę powinieneś unikać używania wartości domyślnych.

Oto przykład:

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

OriginalOcto
źródło
1

Czy może na stole jest wyzwalacz, który go cofa?

Gratzy
źródło