Функция для возврата действительной даты из поля varchar - PullRequest
2 голосов
/ 02 марта 2010

У нас есть функция, которая извлекает дату из первых 8 символов строки. Из-за того, как эта система была написана, пользователям говорят, что они должны ввести дату в формате 8 символов в поле. Например, 12/06/10 должно быть введено. То, как была написана исходная функция, 6 декабря 2010 года или 12 июня 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 ]

2 голосов
/ 02 марта 2010

Дата окончания столетия контролируется настройкой SQL Server - за подробным объяснением читайте этот пост в блоге .

Выполните это, чтобы увидеть текущие настройки:

sp_configure 'show advanced options', 1
RECONFIGURE

sp_configure 'two digit year cutoff'

Вы также можете изменить эту опцию при необходимости.

1 голос
/ 03 марта 2010

Только частично протестировано на 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
1 голос
/ 02 марта 2010

Вы можете использовать операторы TRY и CATCH для повышения надежности.

...