MS SQL:ISDATE()在无法转换为日期时应返回“1”吗?

时间:2017-01-27 15:01:54

标签: sql sql-server type-conversion

大家,

在运行2012 SP3的SQL Server实例上,以下代码返回“1”:

SELECT ISDATE('january,25,1999')

但是,以下内容无法转换:

SELECT CAST('january,25,1999' AS DATE)

Msg 241, Level 16, State 1, Line 1
Conversion failed when converting date and/or time from character string.

我误解了ISDATE()应该返回的内容吗?为什么ISDATE()为字符串返回值“1”?我们应该如何从SQL Server确定诸如“january,25,1999”之类的字符串是否可以作为日期输入?

谢谢!

3 个答案:

答案 0 :(得分:5)

忘记ISDATE()!您正在使用SQL Server 2012:

SELECT TRY_CONVERT(date, 'january,25,1999')

如果日期无法转换,则会返回NULL - 我不认为这可以。您可以为要转换的特定格式指定第三个参数。

我会在SQL Server 2014中注意到:

SELECT TRY_CONVERT(date, 'january,25,1999')

返回错误。

SELECT TRY_CONVERT(datetime, 'january,25,1999')

成功。

我不知道为什么。但是你想要的是什么:

SELECT CONVERT(DATE, TRY_CONVERT(datetime, 'january,25,1999'))

答案 1 :(得分:2)

您需要使用CONVERT而不是CAST来解析非标准字符串格式的日期。

SELECT CONVERT(datetime, 'january,25,1999')

将为您提供包含1999-01-25 00:00:00.000

的SQL Server日期时间

答案 2 :(得分:0)

关于2008R2部分... 我发现ISDATE函数的问题是

-我的有效日期dd / mm / yy以char形式存储 选择ISDATE('dd / mm / yy')会返回零,除非您将其转换为日期

选择ISDATE(convert(date,'dd / mm / yy',103)..说

,但是结果是,当转换评估非日期字段时,这将返回错误。

解决方法是先运行

SET DATEFORMAT dmy; (假设这是proc的作用域,但可能不是吗?)

然后ISDATE('dd / mm / yy')应该返回1