我有一张表,需要验证某个列是否只包含日期。我正在尝试计算不遵循日期格式的记录数。如果我检查一个我没有定义为“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无效。
有关为什么此查询不适用于我定义为日期的字段的任何见解?
谢谢!
答案 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类型的参数,所以如果你使用日期类型它将不起作用。
此外,如果您使用日期作为该字段的类型,则不必检查其中的信息,因为它不会接受其他类型的字段。
您只需检查列中的空值即可。