Sql 函数从varchar字段返回有效日期

Sql 函数从varchar字段返回有效日期,sql,sql-server,tsql,sql-server-2000,Sql,Sql Server,Tsql,Sql Server 2000,我们有一个函数,它从字符串的前8个字符中提取日期。由于该系统的编写方式,用户被告知必须在字段中以8个字符的格式输入日期。例如,必须输入12/06/10。按照原始函数的编写方式,2010年6月12日或2010年6月12日将生成错误的日期 我在下面的代码中修改了这个函数来纠正这个问题,我想知道是否有人有任何其他的建议来让它更加防弹。我假设返回datetime将始终返回19xx或20xx的有效日期。我不确定SQL使用什么来确定何时使用19xx和20xx,我也不担心日期小于1980年而大于2100年 对

我们有一个函数,它从字符串的前8个字符中提取日期。由于该系统的编写方式,用户被告知必须在字段中以8个字符的格式输入日期。例如,必须输入12/06/10。按照原始函数的编写方式,2010年6月12日或2010年6月12日将生成错误的日期

我在下面的代码中修改了这个函数来纠正这个问题,我想知道是否有人有任何其他的建议来让它更加防弹。我假设返回datetime将始终返回19xx或20xx的有效日期。我不确定SQL使用什么来确定何时使用19xx和20xx,我也不担心日期小于1980年而大于2100年

对于此应用程序,我们仍使用SQL Server 2000

Alter FUNCTION [dbo].[GetDateFromField] ( @FieldString varchar(256) )   
RETURNS datetime AS

BEGIN

    DECLARE @tempResult varchar(8)

    SET @tempResult =  left(@FieldString,8)

    IF isdate(@tempResult) = 0
    BEGIN
        SET @tempResult = NULL
    END

    RETURN @tempResult

END

您可以使用TRY-and-CATCH语句来增强健壮性。

世纪截止日期由SQL Server设置控制-请查看这篇文章以获得更好的解释

执行此操作以查看当前设置:

sp_configure 'show advanced options', 1
RECONFIGURE

sp_configure 'two digit year cutoff'

您还可以根据需要更改此选项。

仅在SQL2000上进行了半测试,但我认为这可以处理大多数类似日期的输入

Alter Function GetDateFromField (
    @FieldString Varchar(256) 
) Returns Datetime 
As 
 Begin 
   Declare @tempResult Char(8), @tempDate as datetime
   If Isdate(@FieldString) = 0
      Set @tempResult = NULL
   Else
    Begin
      Select @tempDate = @FieldString
      Select @tempResult = Convert(Char(8), @tempDate, 1)
   End

   Return @tempResult
End

这在为数据库提供数据的代码中得到了更好的管理——大多数现代语言都有一两个函数,试图让用户输入的内容有意义。我同意长期的解决方案是不要求用户在前8个字符中输入日期。这应该是单独的字段。谢谢。varchar(8)似乎有点过于严格-如果您的用户输入'02/26/2010',该怎么办??这不应该被认为是一个有效的日期吗?我同意,这应该在将来改变。这是一个带有一些自定义代码的第三方应用程序。我正在为未来提出一些建议,但只是介入帮助解决这个问题,因为用户无法访问系统的这一部分,因为他们输入的日期是2010年12月6日,而不是2010年12月06日。疯狂的,没有经过深思熟虑的。感谢您的反馈。您能在SQL 2000中使用try catch吗?不,这些是SQL Server 2005及以上版本。很抱歉,我在添加答案时没有看到SQL Server 2000标记。您需要在SQL Server 2000中使用@ERROR进行错误检查。上面的代码实际上更改了这些设置,而不仅仅是显示它们。我将查看博客了解更多信息。谢谢。@Iceman:不,上面的代码启用了高级选项,这样你就可以看到“两位数的年份截止日期”。它不会改变该值@Iceman:只有当你发出一个命令,如
sp_configure'two digital year cutoff',2069 reconfigure
时,设置才会被修改……这基本上就是我最后要做的,只是我没有转换日期。它转换它,因为我返回一个datetime字段。