我需要一个SQL脚本来验证SQL Server 2005数据库中包含DateTime值的表中的VARCHAR字段,格式为DD/MM/YYYY
或NULL
。我想确定所有无效日期。有谁能建议一种方法?
更新
谢谢,MagicAndi
答案 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行,按照今天的标准来说并不是太大了。
如果有用,您可以将奇怪的公司特定属性添加到此表中。这些属性包括日期是否为公司特定假日,以及日期属于哪个会计周,会计月,会计季度和会计年度。
您必须编写一个程序来填充此表,如果您选择了额外的属性,则此程序必须嵌入公司特定的日历规则。
然后,您可以像使用任何代码验证表一样使用此表。您也可以使用它来制作奇特的日历驱动的报告标准,这些标准实施起来非常简单。
如果您的约会时间有限,例如十年甚至一百年,这只是一个好主意。但有时,它真的可以节省时间!我有时使用这种技术使我的数据库独立于一个供应商的日历功能。