SQL Server ISDATE()错误

时间:2013-11-05 19:02:05

标签: sql sql-server

我有一张表,需要验证某个列是否只包含日期。我正在尝试计算不遵循日期格式的记录数。如果我检查一个我没有定义为“date”类型的字段,那么查询就可以了。但是,当我检查一个我定义为日期的字段时,它不会。

查询:

SELECT 
    count(case when ISDATE(Date_Field) = 0 then 1 end) as 'Date_Error'
FROM [table]

列定义:

Date_Field(date, null)

示例数据:'2010-06-27'

错误讯息:

  

参数数据类型日期对于isdate函数的参数1无效。

有关为什么此查询不适用于我定义为日期的字段的任何见解?

谢谢!

4 个答案:

答案 0 :(得分:6)

如果您使用日期类型定义了列,则 IS 为日期。期。这项检查完全没必要。

您可能要做的是在列中查找NULL值:

SELECT SUM(case when Date_Field IS NULL THEN 1 ELSE 0 end) as 'Date_Error' FROM [table]

我还感觉到有关Date字段(包括DateTime和DateTime2)如何在Sql Server中工作的额外误解。这些字段中的值不会以任何格式存储为字符串。它们以二进制/数字格式存储,并且仅在查询工具中显示为字符串。这是一件好事。如果您希望以特定格式显示日期,请在查询中使用CONVERT()函数,甚至更好,让您的客户端应用程序处理格式化。

答案 1 :(得分:2)

ISDATE()仅针对类似STRING的参数(varchar,nvarachar,char,...)进行评估

可以肯定的是,ISDATE()的参数应该包含在cast()函数中。

Select isdate(cast(parameter as nvarchar))

应返回1或0,即使它是MULL值。

希望这有帮助。

答案 2 :(得分:1)

IsDate采用字符串或表达式产生字符串作为其参数

答案 3 :(得分:0)

问题是这个方法ISDATE()只允许在“time”类型中使用datetime和smalldatetime类型的参数,所以如果你使用日期类型它将不起作用。

此外,如果您使用日期作为该字段的类型,则不必检查其中的信息,因为它不会接受其他类型的字段。

您只需检查列中的空值即可。