【问题标题】:SQL Server ISDATE() ErrorSQL Server ISDATE() 错误
【发布时间】:2013-11-05 19:02:04
【问题描述】:

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

查询:

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 无效。

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

谢谢!

【问题讨论】:

  • 如果您使用日期类型定义列,则它日期。时期。无需进一步检查。
  • isDate 函数需要一个文本字段作为输入,而不是日期字段。正如 Joel C 所说,如果该字段被定义为日期字段,那么该字段中的值必须是日期。
  • 另外:首先将日期值存储在字符串列中是不好的。需要将 ISDATE() 用于修复旧模式设计之外的任何事情都是代码异味。

标签: sql sql-server


【解决方案1】:

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

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

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

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

【讨论】:

  • @Kaf 我喜欢直言不讳
【解决方案2】:

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

当然,ISDATE() 的参数应该包含在 cast() 函数中。

Select isdate(cast(parameter as nvarchar))

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

希望这会有所帮助。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2017-04-19
        • 2012-02-18
        • 2023-01-08
        • 1970-01-01
        • 1970-01-01
        • 2019-06-08
        • 1970-01-01
        • 1970-01-01
        • 2015-07-31
        相关资源
        最近更新 更多