2013-03-07 8 views
0

У меня есть значение в SQL, которое представляет дату, но оно типа nvarchar. Значение даты в формате:Преобразование даты в формате UK в datetime

dd/mm/yyyy hh:mm 

мне нужно представить эту колонку через зрения на 800 базы данных в формате CCure DATETIME. Я ожидал использовать CAST/CONVERT; Однако, при использовании этого, возвращается следующее сообщение об ошибке:

Сообща 242, уровень 16, состояние 3, строка 1
Преобразования типа данных VARCHAR к типу DateTime данных привел к внеконкурсному значение диапазона.

+0

Существует аналогичный вопрос. См. Одно из [предложений] (https://stackoverflow.com/questions/20838344/sql-the-conversion-of-a-varchar-data-type-to-a-datetime-data-type-resulted-in/ 38081347 # 38081347) это можно сделать. – Sumit

ответ

10

Пожалуйста, прекрати хранения дат в виде строк и особенно как строки Unicode. Вы обеспокоены тем, что в какой-то будущей версии нашего календаря будут появляться умлауты, значки фунта, иероглифы или мандарин вместо цифр?

Срок хранения по датам. Вот для чего предназначены эти типы данных. В дополнение к тому, что вам не нужно беспокоиться о недействительных интерпретациях, вы также получаете все преимущества таких вещей, как DATEPART и DATEADD, и вам не нужно беспокоиться о том, чтобы кто-нибудь наполнил чушь в колонку (что-нибудь от 31/02/2012 до 'I don''t want to enter a real date' ...

в то же время, вам просто нужно использовать номер стиля с CONVERT (это не будет надежно работать с CAST):

SELECT CONVERT(DATETIME, '13/06/2013 09:32', 103); 

чтобы заставить его работать с CAST, вы можете установить свои LANGUAGE или DATEFORMAT настройки соответственно, но вы не можете сделать это insi de view, и он делает код очень хрупким, так или иначе ИМХО.

SET DATEFORMAT DMY; 
SELECT CAST('13/06/2013 09:32' AS DATETIME); 

Или

SET LANGUAGE BRITISH; 
SELECT CAST('13/06/2013 09:32' AS DATETIME); 

К очень большим отрывом, я предпочитаю дополнительный контроль CONVERT дает вам, и почти в одностороннем порядке изменить все экземпляры CAST к CONVERT, даже если этот контроль не требуется, для (зачем использовать CAST в некоторых случаях и CONVERT, когда вам это нужно, когда вы можете просто использовать CONVERT всегда?).

EDIT

Чтобы идентифицировать данные мусора, который пробрался в таблицу из-за выбором плохого типа данных, сделайте это (и затем исправить данные или, еще лучше, исправить тип данных, так это Безразлично Повторяется еще раз):

SET DATEFORMAT DMY; 
SELECT date_column FROM dbo.table_name WHERE ISDATE(date_column) = 0; 
+0

Спасибо - поймите теорию о датах, и вы совершенно правы. Однако предположим, что в этом случае это невозможно. – user2145047

+0

@ user2145047 ну, я все же предоставил * ответ *. Чтение с «Тем временем» на ... –

+0

Я также пытался использовать CONVERT (а также CAST), но ключ к проблеме заключается в том, что он не будет работать, когда формат строки соответствует «DD/MM/YYYY HH: MM "- CONVERT не конвертирует это в дату. – user2145047

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