Як ви оновлюєте поле DateTime у T-SQL?


81

Наступний запит не оновлює поле дати та часу:

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

Я також спробував без тире, але це теж не працює.


1
дата фактична назва стовпця?
Gratzy

1
насправді це не EndDate, але я просто скоротив його до Date.
Xaisoft

Ви отримуєте повідомлення про помилку чи просто відсутність результатів?
Gratzy

Який тип даних для EndDateстовпця?
OMG Ponies

Там написано, що вплинув 1 рядок, але коли я перевіряю, дата не змінилася.
Xaisoft

Відповіді:


154

Якщо ви сумніваєтесь, будьте явними щодо перетворення типу даних за допомогою CAST / CONVERT :

UPDATE TABLE
   SET EndDate = CAST('2009-05-25' AS DATETIME)
 WHERE Id = 1

1
велике спасибі добре працює в SQL сервері 2016. Я просто використовую змінні і все встановлено.
PatsonLeaner

Я використав це і додав час після дати, і це спрацювало
FernandoZ

33

Зазвичай це повинно працювати.

Але чи можете ви спробувати це? У мене немає SQL на домашньому ПК, я не можу спробувати себе

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

1
Це спрацювало, але я спробував це раніше без усіх нулів, і це не спрацювало. Чому?
Xaisoft

Я спробував із "25.05.2009 00: 02: 01.000", але це не спрацювало.
Xaisoft

Приємно, серйозно не маю ідеї. Оскільки ви писали без інформації про час, і SQL повинен автоматично вкласти 00: 00: 00.000 за замовчуванням. Тож над цим треба працювати.
Серкан Хекімоглу

11

Рядковий літерал встановлюється на пазу відповідно до поточного параметра формату дати, див SET DATEFORMAT. Формат, який завжди працюватиме, - це формат "20090525".

Тепер, звичайно, вам потрібно визначити "не працює". Жодні записи не оновлюються? Можливо, Id=1це не відповідає жодному запису ...

Якщо там написано "Один запис змінено", можливо, вам потрібно показати нам, як ви підтверджуєте ...


Формат дати - ось чому я думав, що чітко визначити перетворення було б непоганою ідеєю ...
OMG Ponies

Хороший матеріал Remus, SET DATEFORMATдійсно ефективний при написанні SQL для середовищ з різною локалізацією
Matt R

Чудово! Це спрацювало для мене і врятувало кілька кроків, оскільки поле, яке я перетворюю, вже використовувало цей формат, тобто немає необхідності перетворювати його в ISO чи інший формат спочатку.
Роберто

8

Використання параметра DateTime - найкращий спосіб. Однак якщо ви все-таки хочете передавати DateTime як рядок, то CAST не повинен бути необхідним за умови використання мовного агностичного формату.

напр

Дано таблицю, створену на зразок:

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

Завжди повинно працювати наступне:

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

Працюватиме наступне:

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

Однак це не буде:

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

Це тому, що 'РРРР-ММ-ДД' не є мовно-агностичним форматом (з точки зору сервера SQL).

Формат ISO `` РРРР-ММ-ДДТгг: мм: сс '' також є агностичним для мови та корисним, коли вам потрібно пройти ненульовий час.

Докладніше: http://karaszi.com/the-ultimate-guide-to-the-datetime-datatypes



2

Це має спрацювати, я б поставив дужки навколо [Date], оскільки це зарезервоване ключове слово.


2

Якщо ви не зацікавлені вказувати час, ви також можете використовувати формат ' DD / MM / YYYY ', однак я б дотримувався методу перетворення та відповідного формату ISO, оскільки вам справді слід уникати використання значень за замовчуванням.

Ось приклад:

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


1

Чи є, можливо, тригер на столі, повертаючи його назад?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.