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

时间:2010-03-02 15:09:44

标签: sql sql-server tsql sql-server-2000

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

我将函数修改为下面的代码来纠正这个问题,并想知道是否有人有任何其他建议来使这更加防弹。我假设返回日期时间将始终返回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

3 个答案:

答案 0 :(得分:2)

“世纪截止”日期由SQL Server设置控制 - 请查看此blog post以获得更好的解释。

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

sp_configure 'show advanced options', 1
RECONFIGURE

sp_configure 'two digit year cutoff'

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

答案 1 :(得分:1)

您可以使用TRY和CATCH语句来提高稳健性。

答案 2 :(得分:1)

只在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