2

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

询问:

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

列定义:

Date_Field(date, null)

样本数据:'2010-06-27'

错误信息:

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

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

谢谢!

4

4 回答 4

6

如果您使用日期类型定义列,则它日期。时期。这个检查是完全没有必要的。

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

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

我还感觉到关于日期字段(包括 DateTime 和 DateTime2)如何在 Sql Server 中工作的另一个误解。这些字段中的值根本不以任何格式存储为字符串。它们以二进制/数字格式存储,并且仅在查询工具中显示为字符串以方便查询。这是一件好事。如果您想要特定格式的日期,CONVERT()请在查询中使用该函数,或者更好的是,让您的客户端应用程序处理格式。

于 2013-11-05T19:05:37.760 回答
4

ISDATE()仅针对类似字符串的参数(varchar、nvarachar、char、...)进行评估

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

IE

Select isdate(cast(parameter as nvarchar))

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

希望这可以帮助。

于 2013-11-19T18:54:24.517 回答
1

IsDate 接受一个字符串或表达式,它产生一个字符串作为它的参数

于 2013-11-05T19:05:47.927 回答
0

问题是这个方法 ISDATE() 只接受“时间”类型中的 datetime 和 smalldatetime 类型的参数,所以如果你使用 date 类型,它就不起作用。

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

您应该只检查列中的空值,仅此而已。

于 2013-11-05T19:11:10.710 回答