2016-08-18 5 views
0

Я включил в инструкцию «in» данные, содержащиеся в logdate.Как преобразовать эту строку даты в datetime?

по какой-то причине я не могу их преобразовать. Я больше привык к оракулам баз данных, которые обрабатывают этот материал более прощающим образом. Поэтому я изо всех сил пытаюсь понять, что происходит не так.

select CONVERT(DATETIME,opencall.logdate,102) 
    from opencall 
    where logdate in 
    ( '17/08/2016 10:33:08' 
    ,'17/08/2016 10:33:13' 
    ,'17/08/2016 10:33:17' 
    ,'17/08/2016 10:34:03' 
    ,'17/08/2016 10:34:14' 
    ,'17/08/2016 10:34:46') 
    ; 

я получаю ошибку [S0003] [242] Преобразование типа данных VARCHAR к типу DateTime данных привело к значению вне-диапазона.

и я попытался

select cast(opencall.logdate as datetime) 
    from opencall 
    (
    '17/08/2016 10:33:08' 
    ,'17/08/2016 10:33:13' 
    ,'17/08/2016 10:33:17' 
    ,'17/08/2016 10:34:03' 
    ,'17/08/2016 10:34:14' 
    ,'17/08/2016 10:34:46' 
    ) 

я получаю ошибку [S0003] [242] Преобразование типа данных VARCHAR к типу DateTime данных привело к значению вне-диапазона.

Что я делаю неправильно на этот раз?

:-)

+1

Ваш сервер принимает 'MM формат/DD/YYYY' так' 17/08/2016' рассмотреть '17' в месяц,' 08', как дата, так что он бросает erroe – Arulkumar

+0

из диапазона происходит потому, что формата DD/MM, поэтому SQL читает его как месяц 17, который не существует. – scsimon

+0

Кроме того, Sql Server обрабатывает значения datetime без компонента полного времени, как если бы оставшаяся часть компонента времени была равна нулю. Этот запрос будет работать, только если таблицы 'opencall' имеют значения, которые ** точно совпадают' 17/08/2016 10: 33: 08.000', '17/08/2016 10: 33: 13.000',' 17/08/2016 10: 33: 17.000' и ​​т. Д. Любые дробные значения второго значения, хранящиеся в таблице _WILL_, прерывают этот запрос. –

ответ

0

причина вы получаете сообщение об ошибке, что ваш система настроена на mm/dd/yyyy, и вы пытаетесь заставить ее принять dd/mm/yyyy, поэтому любое значение с dd более 12 или мм за соответствующее количество дней месяца вызовет ошибку.

Чтобы преодолеть это использование CONVERT дважды, чтобы определить формат явно.

Первый CONVERT заботится о проблеме вне диапазона, указав, что входной сигнал в формате 103 (европейский). Второй CONVERT отличает результат от 102, формат времени US mm/dd/yyyy +.

select CONVERT(DATETIME, convert(datetime, '17/08/2016 10:33:08',103) ,102) 
+0

BINGO !!!! Спасибо, человек! всего за две недели пролетел на этом сервере! и все это стало выглядеть так похоже! выплюньте мое высокомерие! – TuckRollworthy

+0

Конечно, когда дело доходит до формата даты, он может стать сложным, поскольку он включает в себя SQL-по умолчанию, ОС по умолчанию и настройку ODBC. слишком много номеров! приветствие. (хотя смешно, похоже, кто-то проголосовал за мой ответ ...) – Kentaro

+0

В качестве альтернативы вы можете просто использовать SET DATEFORMAT dmy; И CAST – Kentaro

0

самый безопасный способ заключается в использовании формата ISO для форматирования DateTime, он не всегда будет приниматься независимо от того, к какой культуре ваш дб в

хорошая информация может быть найти здесь.: http://www.karaszi.com/SQLServer/info_datetime.asp#RecommendationsInput

за то, что дата и время это ваш формат: «1998-02-23T14: 23: 05»

select cast(opencall.logdate as datetime) 
from opencall 
where logdate in 
(
    '2016-08-17T10:33:08', 
    and so on... 
+0

Это своего рода отстой, но я понимаю, что существуют некоторые краевые ситуации по историческим причинам, так что формат Unsparated ISO (YYYYMMDD) лучше, чем прямой ISO 8601 (YYYY-MM-DD). Вот пример: http://stackoverflow.com/questions/19565320/why-is-sql-server-misinterpreting-this-iso-8601-format-date (прочитайте ответ, а не вопрос) –

+0

да datetimes - боль в ... Я согласен, но если вы используете ISO-форматы, у вас никогда не возникнут проблемы – GuidoG

+0

ура! Если бы у меня был выбор, какой формат будет для базы данных, я бы это сделал. Увы, я технический аналитик, настраиваю отчет за пределами стороннего приложения. Так что у меня нет выбора в каком формате должно быть. – TuckRollworthy

Смежные вопросы