MS SQL:ISDATE()在不能强制转换为日期时是否应返回“1”?

MS SQL:ISDATE()在不能强制转换为日期时是否应返回“1”?,sql,sql-server,type-conversion,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. 我是不是误解了我应该返回的日

各位,

在运行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为字符串返回值1?我们应该如何从SQL Server确定是否可以将字符串(如1999年1月25日)强制转换为日期


谢谢

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

SELECT CONVERT(datetime, 'january,25,1999')
将为您提供包含1999-01-25 00:00:00.000的SQL Server日期时间!您正在使用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'))

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

-我的有效日期dd/mm/yy存储为字符 选择ISDATE'dd/mm/yy'返回零,除非转换为日期

选择ISDATEconvertdate,'dd/mm/yy',103。。说

,但是,因此,当转换对非日期字段求值时,将返回一个错误

解决这个问题的方法是先跑

设置日期格式dmy; 假设这是proc的范围,但可能不是


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

也许开始尝试块会有帮助。ISDATE是ISNUMERIC的一个稍微理智一点的表亲,但它们都会让你陷入同一个陷阱-这个字符串可以转换成任何日期/数字数据类型吗,我不在乎哪一种在这种情况下,它可以转换为日期时间。@Damien_不信者。为什么它可以转换为日期时间,而不是日期?@GordonLinoff-没有一个可靠的答案,除了这样一个事实:当你使用新的数据类型时,与datetime相比,它们似乎清除了许多愚蠢/意外的转换。例如,假设英国有人将使用YYYY-DD-MM格式。date和datetime都为空me@Jonny . . . 我怀疑这一功能从2012年到2014年发生了变化。字符串中还有其他不可见的字符吗?@Jonny-您登录时的默认语言是什么?e、 g.见set语言英语;选择TRY_CONVERTdatetime“251999年1月”;设置意大利语;选择TRY_CONVERTdatetime,“1999年1月25日”谢谢!这很好,正是我们需要的。我们也有一个SQL Server 2008 R2服务器,我们开发的是的,是的,我知道,我接受你的责骂,我们将无法采取这种方法。也许我们会以此作为升级服务器的激励。如果您碰巧知道一个很好的2008 R2解决方案,我将不胜感激,但我从一开始就知道它不受主流支持。@Jonny。它在SQL Server 2014中确实有效。它不适用于date,但适用于datetime。