2012-06-15 98 views
5

我知道有一个称为isdate()来验证日期时间列的函数,但它只适用于smalldatetime和datetime类型。 现在的问题是:有没有类似的方式来验证sql server 2008和2012中的新数据类型datetime2?是否有像datedate2这样的函数?

+3

严格地说ISDATE()不验证datetime列;它验证表达式是否可以解析为日期时间。它在一个专栏之后有点晚了! –

+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

聪明的答案!我很喜欢它!另一个关于sql server 2008中的datetime2的问题是,有没有办法在1753年1月1日之前检查有效日期?使用此命令将会导致无效日期SELECT ISDATE(LEFT('2012-02-02 13:42:55.2323623',23)); – Vladimir

+0

@Vladimir对不起,我现在才注意到你的问题。这是学术还是你真的有日期<1753年? –

相关问题