2012-06-15 4 views
5

Я знаю, что существует функция, называемая isdate() для проверки столбцов datetime, но она работает только для типов smalldatetime и datetime. Вопрос: существует ли аналогичный способ проверки нового типа данных datetime2 в SQL Server 2008 и 2012?Есть ли функция, подобная isdate() для datetime2?

+3

строго говоря IsDate() не проверяет даты-столбцы; он проверяет, может ли выражение анализироваться как дата-время. После того, как это в колонке, это немного поздно! –

+1

@MitchWheat, это хороший момент. Кажется более вероятным проверить либо (a) даты, которые были неправильно сохранены в столбце varchar, либо (b) входные параметры, имеющие неправильный тип данных. –

+0

Я хотел бы проверить ввод с листа Excel, который имеет некоторые столбцы даты во временную таблицу. – Vladimir

ответ

12

В SQL Server 2012 можно использовать TRY_CONVERT:

SELECT TRY_CONVERT(DATETIME2, '2012-02-02 13:42:55.2323623'), 
     TRY_CONVERT(DATETIME2, '2012-02-31 13:42:55.2323623'); 

Результаты:

2012-02-02 13:42:55.2323623 NULL 

Или TRY_PARSE: (. Те же результаты)

SELECT TRY_PARSE('2012-02-02 13:42:55.2323623' AS DATETIME2), 
     TRY_PARSE('2012-02-31 13:42:55.2323623' AS DATETIME2); 

Жаль, что я не умный ответ для вас на < 2012. Можно, я думаю, сказать

SELECT ISDATE(LEFT('2012-02-02 13:42:55.2323623', 23); 

Но что чувствует себя грязным.

TRY_CONVERT documentation on MSDN
TRY_PARSE documentation on MSDN

+0

хороший один ................ –

+0

Умный ответ! Мне это очень нравится! Другой вопрос о datetime2 в sql server 2008, есть ли способ проверить действительную дату, когда значение похоже на «1 января 1753 года»? Использование этой команды приведет к недействительной дате SELECT ISDATE (LEFT ('2012-02-02 13: 42: 55.2323623', 23)); – Vladimir

+0

@ Владыка жаль, что я только что заметил ваш вопрос. Является ли это академическим или у вас действительно есть даты <1753? –

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