在SQL Server 2005中验证DateTime字符串

时间:2009-05-18 12:13:11

标签: sql sql-server sql-server-2005 validation datetime

我需要一个SQL脚本来验证SQL Server 2005数据库中包含DateTime值的表中的VARCHAR字段,格式为DD/MM/YYYYNULL。我想确定所有无效日期。有谁能建议一种方法?

更新

  • 答案必须使用T-SQL;出于性能原因,我无法使用SQLCLR。

谢谢,MagicAndi

6 个答案:

答案 0 :(得分:8)

使用“ISDATE()”或“IS NULL”:但首先设置语言以识别日 - 月 - 年订单

SET LANGUAGE british
SELECT ISDATE('12/31/2009'), ISDATE('31/12/2009')

SET LANGUAGE us_english
SELECT ISDATE('12/31/2009'), ISDATE('31/12/2009')

编辑:正如@edosoft所提到的,你也可以使用SET DATEFORMAT。 SET LANGUAGE隐式设置DATEFORMAT,SET DATEFORMAT覆盖SET LANGUAGE

答案 1 :(得分:5)

使用ISDATE()时应指定dateformat。来自联机丛书:

SET LANGUAGE us_english;
SET DATEFORMAT dmy;
SELECT ISDATE('15/04/2008'); --Returns 1.

答案 2 :(得分:3)

您可以使用ISDATE()功能

答案 3 :(得分:2)

您可以使用内置的T-SQL IsDate()函数。 并将列更改为datetime而不是varchar。 您无法对varchar列进行排序或进行任何日期计算。

答案 4 :(得分:0)

SQL的日期处理不是很好,我们写了一个DotNet函数来处理困难案例的DateTime转换。

答案 5 :(得分:0)

我有一个解决方案,虽然它仅适用于某些情况。您的案件可能适合或不适合。

创建一个名为ALMANAC的表,每个有效日期都有一行。您可以使用十年有效日期填充它,只有3,653行,或多或少。即使你走了一百年,那仍然只有36,525行,按照今天的标准来说并不是太大了。

如果有用,您可以将奇怪的公司特定属性添加到此表中。这些属性包括日期是否为公司特定假日,以及日期属于哪个会计周,会计月,会计季度和会计年度。

您必须编写一个程序来填充此表,如果您选择了额外的属性,则此程序必须嵌入公司特定的日历规则。

然后,您可以像使用任何代码验证表一样使用此表。您也可以使用它来制作奇特的日历驱动的报告标准,这些标准实施起来非常简单。

如果您的约会时间有限,例如十年甚至一百年,这只是一个好主意。但有时,它真的可以节省时间!我有时使用这种技术使我的数据库独立于一个供应商的日历功能。