Тип данных аргумента varchar недопустим для аргумента 1 функции AT TIME ZONE

Я беру данные из одной таблицы [SourceTable], где типом данных поля, на которое я ссылаюсь (источник), является VARCHAR. [TargetTable], в который я пытаюсь извлечь данные, имеет тип данных DATETIME.

При запуске скрипта я получаю следующее сообщение об ошибке:

введите описание изображения здесь

Ниже приведен сценарий, который я запускаю:

SELECT
    CONVERT(DATETIME, SWITCHOFFSET([BeginDateTime], DATEPART(TZOFFSET, [BeginDateTime] AT TIME ZONE 'US Eastern Standard Time'))) AS [BeginTime]
FROM [SourceTable]

Примечание: у меня есть два экземпляра, первый из которых - мой «сырой» экземпляр. Отсюда я делаю моделирование и преобразования, необходимые для структурирования данных.


person sqlenthusiast    schedule 18.05.2021    source источник
comment
Сообщение кажется довольно ясным. Если вы предоставили образцы данных, желаемые результаты и объяснение того, что вы хотите реализовать, кто-нибудь может ответить на этот вопрос.   -  person Gordon Linoff    schedule 18.05.2021
comment
... и каков тип данных вашего [BeginDateTime] столбца?   -  person Caius Jard    schedule 18.05.2021
comment
реальный вопрос: почему у вас есть столбец с именем BeginDateTime, если он не является тип данных даты и времени? Если это varchar, это по определению не datetime.   -  person Larnu    schedule 18.05.2021
comment
Привет. Извините, я все еще развиваю свои навыки SQL. У меня есть два экземпляра, первый из которых - мой «сырой» экземпляр. Отсюда я занимаюсь моделированием и преобразованиями.   -  person sqlenthusiast    schedule 18.05.2021
comment
@CaiusJard [BeginDateTime] - это varchar   -  person sqlenthusiast    schedule 18.05.2021
comment
[BeginDateTime] - это varchar, и в этом ваша проблема, @sqlenthusiast. Ошибка сообщает вам, в чем именно проблема. Первый параметр для SWITCHOFFSET должен быть тип данных даты и времени. Исправьте свой дизайн, устраните проблему; измените тип данных вашего столбца BeginDateTime на соответствующее значение даты и времени; похоже, что datetimeoffset это то, что вам нужно.   -  person Larnu    schedule 18.05.2021
comment
@Larnu благодарим вас за отзыв. Я думаю, что это то, что мне нужно было знать - что SWITCHOFFSET должен быть в типе данных, относящемся к дате и времени, и что его преобразование не решит проблему.   -  person sqlenthusiast    schedule 18.05.2021


Ответы (1)


Я фейспалмирую себя, потому что сначала поспешил с решением. Посмотрев сценарий, мне удалось решить мою проблему, выполнив следующие действия:

CONVERT(DATETIME, SWITCHOFFSET(CONVERT(DATETIME, [BeginDateTime], 120) , DATEPART(TZOFFSET, CONVERT(DATETIME, [BeginDateTime], 120) AT TIME ZONE 'US Eastern Standard Time'))) AS [BeginDateTime]
person sqlenthusiast    schedule 18.05.2021
comment
Это не совсем решение. Правильное решение - использовать правильный тип данных. - person Nick.McDermaid; 18.05.2021
comment
Удаление сообщения об ошибке и решение фундаментальной проблемы моделирования данных - это две разные вещи. - person Caius Jard; 18.05.2021
comment
@ Nick.McDermaid У меня есть «сырой» экземпляр, в котором я рассматриваю все как один тип данных. Отсюда я выполняю необходимые преобразования и моделирование, чтобы переместить данные в «структурированный» экземпляр. Исходя из контекста, это могло бы послужить решением моей проблемы :) - person sqlenthusiast; 18.05.2021
comment
Это разумный подход. Вы можете использовать TRY_CONVERT, чтобы элегантно фиксировать любые проблемы с форматированием. - person Nick.McDermaid; 18.05.2021
comment
Преобразование данных, включающих смещение часового пояса, в тип данных datetime неверно. Вы должны использовать тип данных datetimeoffset, что упростит процесс. Вам вообще не нужно преобразовывать, просто убедитесь, что строка имеет правильный формат (например: '2021-05-18 14: 39: 05.1790734 -04: 00'). - person Jeff; 18.05.2021