Я использую SQL-сервер, и мне нужно преобразовать часть строки в datetime, но я получаю сообщение об ошибке
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
Это мой код, который вызывает проблему
SELECT TOP (1) [stream]
, convert(datetime, SUBSTRING(Stream, 12, 10), 103) as Date
FROM x
where .....
select *
from
Когда я меняю datetime на varchar, получается дата «28.03.2021»
Однако мне нужно, чтобы он вышел как «28/03/2021», чтобы заставить его работать, я считаю
По сути, я просто переключил месяц и дату?
Любые идеи?
Привет всем, данные поступают как 28.03.2021. вот почему я показал его как varchar как значение по умолчанию, мне нужно изменить его на 28/03/2021
@d_chawke что содержит Stream? Если синтаксический анализ не удается, это потому, что дата нить не соответствует стилю. Сами даты не имеют формата, это двоичные значения. Если CONVERT завершится успешно, результат не будет иметь формата. Клиент должен так или иначе отображать значение datetime
Не используйте varchar для значений даты и времени. Есть 6 типов данных даты и времени на выбор, которые намного лучше. Типы данных даты и времени также не имеют формата, это зависит от презентации, чтобы выбрать, в каком формате они появляются, нет RDBMS.
Никто не может отлаживать фрагменты операторов sql, которые используют данные, которые нельзя увидеть. Наиболее вероятное объяснение состоит в том, что ваше предположение о формате КАЖДОЙ подстроки в вашей таблице неверно - обычная проблема с использованием строк, в которые есть несколько встроенных «столбцов». Другая распространенная проблема заключается в предположении, что определенная часть вашего запроса является источником проблемы, когда другая часть является фактором. Используйте предложение try_convert, чтобы сначала проверить свое предположение о формате. И обратите внимание, что у вас явно есть дата, а не значение datetime - так зачем конвертировать в datetime?





Здесь недостаточно информации, чтобы дать вам точный ответ - мы не знаем, какие именно вводимые данные вы ему вводите.
Документация по преобразованию в DateTime:
имеет коды локали (где вы передаете 103) для различных форматов даты и времени дд / мм / ггг, мм / дд / гггг и т. д.
найдите тот, который подходит к тому, что вы пытаетесь сделать.
Ваша ошибка о «значении вне допустимого диапазона» означает, что вы используете неправильный формат локали - и значение DAY, превышающее 12 (например, 28-е), интерпретируется как значение MONTH. Поскольку в календаре нет 28-го месяца, возникает ошибка.
вы передаете код локали 103 = британский английский: dd / mm / yyyy Попробуйте заменить это на 101 (en-US) для мм / дд / гггг
Привет @ JimP76, да, мне нужно использовать местный код 103. однако это не меняет его, данные поступают как «28.03.2021». но мне нужно поменять местами день и месяц. Я думал, что, введя код datetime и 103, он сделает это за меня, но, похоже, это не так, поэтому ошибка
28.03.2012 не 103 дружелюбны. Вам нужно будет изменить его на 101. 103 говорит SQL интерпретировать его как 3-й день 28-го месяца в британском английском формате дд / мм / гггг.
@d_chawke в длинном виде, этот ответ говорит, что используйте 101 НЕТ 103 :) вы пытаетесь преобразовать его в дату, поэтому установите стиль в формат, в котором он находится сейчас, и после этого у вас есть собственная дата, которая нет формата.
фантастический! спасибо вам обоим, это отлично работает, извините, я новичок в этом, но это отличное обучение для меня. еще раз спасибо!
Вам необходимо указать SQL Server, какой формат даты для входящего сообщения.
Выпустите set dateformat mdy, а затем выполните свой запрос.
Спасибо за отрицательный голос. Формат даты часто является причиной ошибок даты и времени. Мне очень жаль, что этот ответ вызвал у вас проблемы.
Это был не OP, когда вопрос конкретно использует стиль convert +, тогда не имеет значения, какой формат даты по умолчанию, потому что формат указан. Следовательно, это не ответ на вопрос.
Вы можете использовать try_convert для отладки. Вместо ошибок будет отображаться null:
SELECT TOP (1) [stream]
, convert(datetime, SUBSTRING(Stream, 12, 10), 103) as Date
FROM x
where try_convert(datetime, SUBSTRING(Stream, 12, 10), 103)
is null
В каком именно формате даты во входящем потоке?