Буквальные даты в формате гггг-мм-дд вызывают исключение - PullRequest
0 голосов
/ 05 августа 2020

У меня есть база данных, настроенная с настройками Spani sh, когда я использую буквальные даты как yyyy-mm-dd, я получаю ошибку преобразования varchar вне диапазона.

select convert(datetime, '2014-11-19') 

возвращает

Сообщение 242, уровень 16, состояние 3, строка 3 Обращение к типу данных varchar en datetime produjo un valor fuera de intervalo.

Я должен писать эти даты в испанском языке sh формат. Это отлично работает:

select convert(datetime, '2014-11-19') 

Разве я не могу использовать оба, испанский sh и формат гггг-мм-дд?. Я не хочу использовать испанский формат sh, потому что новый клиент может использовать ту же базу данных с разными региональными настройками.

У меня нет проблем с литералами даты, только с датами. Это отлично работает как в испанском sh, так и в формате гггг-мм-дд.

select convert(date, '2014-11-19'), 
       convert(date, '19-11-2014') 

Спасибо.

Ответы [ 2 ]

2 голосов
/ 05 августа 2020

yyyy-MM-dd не является однозначным в SQL Сервере. Используйте yyyyMMdd или yyyy-MM-ddThh:mm:ss.nnnnnnn. Если вы не американец, то SQL Сервер (по глупости) читает yyyy-MM-dd как yyyy-dd-MM для старых типов данных даты и времени. Исходя из вашей ошибки, вы не американец и, следовательно, ошибка.

Примечание. yyyy-MM-dd однозначно для новых типов данных даты и времени. Microsoft исправила эту «функцию».

В качестве альтернативы вы можете указать код стиля для CONVERT, чтобы указать формат. В данном случае это будет стиль 23: CONVERT(date time,'2014-11-19',23)

0 голосов
/ 05 августа 2020

datetime - это более или менее устаревший тип, и это одна из его причуд. На способ обработки литералов даты в форме yyyy-MM-dd влияет параметр DATEFORMAT .

Реальное решение состоит в том, чтобы не в первую очередь использовали литералы даты. Вместо этого используйте параметры соответствующего типа, в данном случае date. Когда вам нужно использовать литерал даты, используйте yyyyMMdd. Избегайте использования datetime, вместо этого используйте date или datetime2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...