Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Пребразование из строки в дату и стиль преобразования  [new]
Стиль даты
Guest
Наблюдаю вот такую картину:
select convert(datetime, '31/12/2017', 103) union all
select convert(datetime, '31-12-2017', 103) union all
select convert(datetime, '31.12.2017', 103)

-----------------------
2017-12-31 00:00:00.000
2017-12-31 00:00:00.000
2017-12-31 00:00:00.000

select convert(datetime, '2017.12.01', 103)
-----------------------
2017-01-12 00:00:00.000

select convert(datetime, '2017.12.31', 103)
-----------------------
Msg 242, Level 16, State 3, Line 6
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.

Вопрос по первым трем селектам: согласно хелпу, стиль 103 - это маска вида дд/мм/гггг. Почему сервер спокойно переваривает разделители, которых в этой маске нет (дефис и точка)?
Вопрос по второму селекту: в стиле 103 год - последние 4 символа. Однако сервер вытащил год из первых 4 символов, а остальные разбирал в порядке, определенном стилем (сначала день, потом месяц) - почему?
Третий селект, видимо, ведет себя так же, как и второй, и при попытке преобразовать 31 в месяц выдает ошибку. Здесь вопрос тот же, что и ко второму селекту.
По вышеприведенной ссылке, да и вообще в гугле ответов на эти вопросы не нашел.
9 дек 17, 04:19    [21020069]     Ответить | Цитировать Сообщить модератору
 Re: Пребразование из строки в дату и стиль преобразования  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Стиль даты,

давно замечено, что CONVERT() очень лояльно относится ко многим формальным несоответствиям заявленным форматам.
С моей точки зрения это нечестно и неправильно. Но могут быть и другие точки зрения...

Однако, используя стили и соответствующие им форматы, всегда получите правильный результат.
9 дек 17, 12:09    [21020355]     Ответить | Цитировать Сообщить модератору
 Re: Пребразование из строки в дату и стиль преобразования  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3236
Стиль даты,

Потому что эти стили относятся только к преобразованию datetime -> varchar, а вы преобразуете в противоположном направлении. В вашем случае сиквел пробует несколько форматов - сначала указанный в параметре, потом вроде бы еще какие-то, наиболее ходовые - из-за чего иногда трактует части даты не так, как ожидает программист. Если же ничего не подходит, то выкидывает ошибку, да.
9 дек 17, 17:45    [21020832]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить