ФОРМАТ ОБНОВЛЕНИЯ SET не работает в SQL Server 2016? - PullRequest
0 голосов
/ 21 ноября 2019

Инструкция FORMAT работает в SELECT, но не влияет на UPDATE:

SELECT @@VERSION

enter image description here

DROP TABLE IF EXISTS #t;
CREATE TABLE #t(DateMin datetime);
INSERT INTO #t VALUES ('2019-13-01 00:00:00')

SELECT * FROM #t

enter image description here

UPDATE #t SET DateMin = FORMAT(DateMin, 'dd/MM/yyyy');
SELECT * FROM #t;

enter image description here

SELECT @DateMin AS a, FORMAT(@DateMin, 'dd/MM/yyyy') AS b

enter image description here

Ответы [ 2 ]

1 голос
/ 21 ноября 2019

Тип, такой как DATETIME, не сохраняется в формате.

Таким образом, если кто-либо обновляет DATETIME строкой в ​​определенном формате, это не имеет значения для сохраненного значения в поле DATETIME.
Отформатированная строка неявно преобразуется в datetime. По крайней мере, если он в допустимом формате.

Функция FORMAT, которая возвращает NVARCHAR, скорее используется для представления поля даты и времени в запросе.
Или, если вы хотите ВСТАВИТЬ / ОБНОВИТЬ строкуполе с датой и временем в определенном формате. Но этого следует избегать, потому что с датой и временем гораздо проще работать, чем со строкой.

0 голосов
/ 21 ноября 2019

Вы не можете установить выходной формат даты и времени в самой дате.

Если вам нужно вывести дату и время в формате char / varchar, вам нужно использовать функцию convert при выборе данных:

SELECT CONVERT(char(10), CURRENT_TIMESTAMP, 101) -- format: MM/dd/yyyy
SELECT CONVERT(char(10), CURRENT_TIMESTAMP, 103) -- format: dd/MM/yyyy

В вашем случае:

SELECT @DateMin AS a, CONVERT(char(10), @DateMin, 103) AS b

Это работает, как ожидалось.

Если вы хотите иметь изменяемый тип данных, вам нужно объявить его как sql_variant:

DROP TABLE IF EXISTS #t;
CREATE TABLE #t(DateMin sql_variant);
INSERT INTO #t VALUES ('2019-01-13T00:00:00')

UPDATE #t SET DateMin = FORMAT(CAST(DateMin AS datetime), 'dd''/''MM''/''yyyy');
SELECT * FROM #t;

Кроме того, ваше форматное выражение должно явно ставить / в кавычки,aka 'dd''/''MM''/''yyyy', иначе sql-server заменяет его разделителем даты, характерным для текущей культуры, который в моем случае будет ..

Просто используйте вместо этого команду convert 103, она работает на всех версиях sql-сервера и, вероятно, быстрее.

Кроме того, ваш оператор вставки завершается ошибкой в ​​некоторых версиях sql-сервера, потому что iso-date-format2019-01-13T00:00:00, а не 2019-13-01 00:00:00

Правильное значение:

INSERT INTO #t VALUES ('2019-01-13T00:00:00')

SQL-server end of support

Также

DROP TABLE IF EXISTS #t;

только для sql-server 2016+, в противном случае вам нужно

IF OBJECT_ID('tempdb..#t') IS NOT NULL DROP TABLE #t

И после sql-server 2005 вы должны использовать datetime2 вместо datetime. Вы не должны больше использовать datetime, потому что datetime использует float, и, как таковое, неточно - если вы вставите iso значение datetime, это может сделать забавные вещи из-за float-point-machine-epsilon, например, установить его на следующий деньесли у вас есть 23: 59: 59,999, просто как страшный пример.

Советую никогда не использовать тип sql_variant . Если у вас есть временная таблица с определенными столбцами, просто создайте другой столбец, в который вы будете записывать значение char / varchar.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...