#sql #sql-server #tsql
#sql #sql-сервер #tsql
Вопрос:
Итак, у меня есть таблица, и я пытаюсь преобразовать время из его текущего формата, который выглядит следующим образом
Sep 17 2020 1:07AM
Для
2020-09-16 20:07:00.000
если я попытаюсь обновить всю таблицу с помощью
UPDATE
OOTYPE
SET
OOTYPE.LastModified = CONVERT(DATETIME, SWITCHOFFSET(CONVERT(DATETIMEOFFSET, LastModified),
DATENAME(TzOffset, SYSDATETIMEOFFSET())))
он выполняется успешно, но времена все еще находятся в формате
Sep 17 2020 1:07AM
Однако, если я просто выполню простой оператор select, чтобы показать, что он изменился
SELECT CONVERT(DATETIME, SWITCHOFFSET(CONVERT(DATETIMEOFFSET,lastmodified), DATENAME(TzOffset, SYSDATETIMEOFFSET()))) FROM [OOTYPE]
Результат — это именно то, что я ищу…..
2020-09-16 20:07:00.000
У кого-нибудь есть идеи, где я вворачиваю это простое изменение, я потратил на это смущающее количество времени….
Комментарии:
1. Каков тип данных столбца
LastModified
?2. varchar(26) добрый день, сэр
3. Сохраните
datetime
как это; затем используйтеCONVERT
для форматированного отображения — гораздо проще хранить даты как даты!4. Проблема в том, что вы храните значения даты и времени как a
varchar
; существует 6 типов данных даты и времени, и все они бесконечно лучше подходят для хранения таких данных. Что касается формата, данные даты и времени хранятся в виде двоичного значения, это уровень приложения / представления, который должен беспокоиться о формате, а не о СУБД. Исправьте дизайн, а затем выполните форматирование в вашем приложении.5. Это не так, но если вы просматриваете данные, ваш клиент просмотра делает некоторые предположения и находит способ отобразить их для вас. Если вы преобразовали его (или сохранили) как тип даты date / datetime, то он сохраняется как чистая дата без форматирования.
Ответ №1:
Если я правильно вас понял:
SELECT CONVERT(varchar, CONVERT(datetime, 'Sep 17 2020 1:07AM'), 121)
Вы должны использовать стиль преобразования 121
, который есть yyyy-mm-dd hh:mi:ss.mmm
.