SQL Server преобразует строку в datetime

Я использую 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», чтобы заставить его работать, я считаю

По сути, я просто переключил месяц и дату?

Любые идеи?

В каком именно формате даты во входящем потоке?

Arvo 30.03.2021 12:50

Привет всем, данные поступают как 28.03.2021. вот почему я показал его как varchar как значение по умолчанию, мне нужно изменить его на 28/03/2021

d_chawke 30.03.2021 12:53

@d_chawke что содержит Stream? Если синтаксический анализ не удается, это потому, что дата нить не соответствует стилю. Сами даты не имеют формата, это двоичные значения. Если CONVERT завершится успешно, результат не будет иметь формата. Клиент должен так или иначе отображать значение datetime

Panagiotis Kanavos 30.03.2021 12:57

Не используйте varchar для значений даты и времени. Есть 6 типов данных даты и времени на выбор, которые намного лучше. Типы данных даты и времени также не имеют формата, это зависит от презентации, чтобы выбрать, в каком формате они появляются, нет RDBMS.

Larnu 30.03.2021 13:09

Никто не может отлаживать фрагменты операторов sql, которые используют данные, которые нельзя увидеть. Наиболее вероятное объяснение состоит в том, что ваше предположение о формате КАЖДОЙ подстроки в вашей таблице неверно - обычная проблема с использованием строк, в которые есть несколько встроенных «столбцов». Другая распространенная проблема заключается в предположении, что определенная часть вашего запроса является источником проблемы, когда другая часть является фактором. Используйте предложение try_convert, чтобы сначала проверить свое предположение о формате. И обратите внимание, что у вас явно есть дата, а не значение datetime - так зачем конвертировать в datetime?

SMor 30.03.2021 14:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
51
3

Ответы 3

Здесь недостаточно информации, чтобы дать вам точный ответ - мы не знаем, какие именно вводимые данные вы ему вводите.

Документация по преобразованию в DateTime:

https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql?view=sql-server-ver15

имеет коды локали (где вы передаете 103) для различных форматов даты и времени дд / мм / ггг, мм / дд / гггг и т. д.

найдите тот, который подходит к тому, что вы пытаетесь сделать.

Ваша ошибка о «значении вне допустимого диапазона» означает, что вы используете неправильный формат локали - и значение DAY, превышающее 12 (например, 28-е), интерпретируется как значение MONTH. Поскольку в календаре нет 28-го месяца, возникает ошибка.

вы передаете код локали 103 = британский английский: dd / mm / yyyy Попробуйте заменить это на 101 (en-US) для мм / дд / гггг

Привет @ JimP76, да, мне нужно использовать местный код 103. однако это не меняет его, данные поступают как «28.03.2021». но мне нужно поменять местами день и месяц. Я думал, что, введя код datetime и 103, он сделает это за меня, но, похоже, это не так, поэтому ошибка

d_chawke 30.03.2021 12:55

28.03.2012 не 103 дружелюбны. Вам нужно будет изменить его на 101. 103 говорит SQL интерпретировать его как 3-й день 28-го месяца в британском английском формате дд / мм / гггг.

jimP76 30.03.2021 12:56

@d_chawke в длинном виде, этот ответ говорит, что используйте 101 НЕТ 103 :) вы пытаетесь преобразовать его в дату, поэтому установите стиль в формат, в котором он находится сейчас, и после этого у вас есть собственная дата, которая нет формата.

Dale K 30.03.2021 12:56

фантастический! спасибо вам обоим, это отлично работает, извините, я новичок в этом, но это отличное обучение для меня. еще раз спасибо!

d_chawke 30.03.2021 12:58

Вам необходимо указать SQL Server, какой формат даты для входящего сообщения.

Выпустите set dateformat mdy, а затем выполните свой запрос.

Спасибо за отрицательный голос. Формат даты часто является причиной ошибок даты и времени. Мне очень жаль, что этот ответ вызвал у вас проблемы.

Stu 30.03.2021 13:04

Это был не OP, когда вопрос конкретно использует стиль convert +, тогда не имеет значения, какой формат даты по умолчанию, потому что формат указан. Следовательно, это не ответ на вопрос.

Dale K 30.03.2021 13:05

Вы можете использовать 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

Другие вопросы по теме