我们有一个函数可以从字符串的前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
答案 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