#sql-server #datetime #timezone
Вопрос:
У меня есть набор дат, таких как 2023-11-30 23:59:59.0000000 00:00. Я хочу обновить только смещение часового пояса с 00:00 до 01:00 для всех из них. Если это облегчает задачу, все время 23:59:59.0000000, и различается только дата.
Я пробовал это:
UPDATE Table SET Date = DATEADD(DAY, DATEDIFF(DAY, 0, Date), '2023-11-30 23:59:59.0000000 01:00')
Но он работал только с точностью до секунд, без миллисекунд, наносекунд и tzoffset. У меня есть эта ошибка, когда я попробовал это:
Не удалось выполнить преобразование при преобразовании даты и/или времени из символьной строки.
Ответ №1:
Похоже, ты хочешь TODATETIMEOFFSET
:
DECLARE @YourValue datetimeoffset(7) = '2023-11-30 23:59:59.0000000 00:00'; SELECT TODATETIMEOFFSET(@YourValue,' 01:00');
Это возвращается 2023-11-30 23:59:59.0000000 01:00
. Это работает, потому что оно принимает ваше datetimeoffset
значение и (неявно) преобразует его в datetime2
первое, которое усекает значение смещения, а затем добавляет новое смещение к значению; таким образом, не изменяется фактическое время и только смещение.
Если вы говорите, что на самом деле меняете значение так, чтобы дата и время менялись со смещением, то вы хотите SWITCHOFFSET
:
DECLARE @YourValue datetimeoffset(7) = '2023-11-30 23:59:59.0000000 00:00'; SELECT SWITCHOFFSET(@YourValue,' 01:00');
Это возвращается 2023-12-01 00:59:59.0000000 01:00
.
Комментарии:
1. Большое спасибо! Я суперноб, поэтому я использовал
UPDATE Table SET Date = TODATETIMEOFFSET (Date, ' 01:00')
, но это все равно сработало! 🙂