2012-06-27 2 views
1

사회 보장 번호 확인 기능 내부의 날짜를 확인해야합니다. 받아 들여야하는 날짜 형식은 ddmmyyyy입니다 (예 : 01012000 (2000 년 1 월 1 일)).t-sql 함수 내에서 datetime의 유효성 확인

내가 yyyy-mm-dd에이 문자열을 변환하고 IsDate() 기능을 사용하여 시도했지만 문제가 SQLSERVER의 때때로 datetimeformat가 DMY 같은 다른 뭔가가 될 수도 있고, 나는 그것 때문에 함수 내에서 "DateFormat의 YMD 설정"을 사용할 수 없다는 것입니다 이 오류를 범 :

Invalid use of a side-effecting operator 'SET COMMAND' within a function.

는 또한하지만 동일한 결과와 try .. catch 블록을 시도했다.

그래서 사용자 함수에서 SqlServer dateformat에 관계없이 datetime의 유효성을 검사 할 방법이 필요합니다.

+4

'yyyymmdd'는 설정에 독립적입니다. 왜 어쨌든 문자열로 주위에 날짜를 전달하고 있습니까? 애플리케이션이 DB에 도착하기 전에 애플리케이션의 정확성을 검증하고 적절한 데이터 유형으로 변환 할 수 없습니까? –

+0

이미 데이터베이스에있는 핀란드 사회 보장 번호를 확인하려고합니다. 그리고 그 형식은 항상 ddmmyy입니다. – Jaska

+0

그래서 문자열을'yyyy-mm-dd' 대신'yyyymmdd'로 변환하고'isdate'를 사용하면됩니다. –

답변

0

SELECT ISDATE('2005-05-22')SET DATEFORMAT dmy에 의해 영향을받습니다과 같아 0을 반환 함

그러나

SELECT ISDATE('20050522')은 dateformat이 dmy 인 경우에도 영향을받지 않으므로 데이터베이스에서 기본값으로 사용되는 모든 dateformat과 독립적으로 사용할 수 있습니다.

+0

이상하지만 작동합니다! – Jaska

2

이 스 니펫은 입력을 변환하려고 시도합니다. 먼저 문자열을 과 함께 독일 시간 형식 dd.mm.yyyy으로 변경합니다. 변환 중 오류를 표시하지 않으려면 begin try을 사용하십시오.

성공하면 날짜는 @output_dt입니다. 실패 할 경우 @output_dtnull이됩니다.

declare @input_str varchar(25) 
declare @output_dt date 
set @input_str = '31122011' 

if len(@input_str) >= 8 
    begin 
    declare @german_str varchar(25) 
    select @german_str = substring(@input_str, 1, 2) + '.' + 
          substring(@input_str, 3, 2) + '.' + 
          substring(@input_str, 5, 4) 

    begin try 
     select @output_dt = convert(date, @german_str, 104) 
    end try 
    begin catch 
    end catch 
    end 

select @output_dt 

당신이 begin catch을 사용할 수없는 경우, 당신은 유효한 날짜와 테이블을 만들 수 있습니다.

if object_id('ValidDates') is not null 
    drop table ValidDates 
create table ValidDates (date_str varchar(8), dt date) 
go 
truncate table ValidDates 

declare @start_dt date 
declare @end_dt date 
set @start_dt = '1900-01-01' 
set @end_dt = '2100-01-01' 

; with cte as 
     (
     select @start_dt as dt 
     union all 
     select dateadd(day, 1, dt) 
     from cte 
     where dt < @end_dt 
     ) 
insert ValidDates 
     (date_str, dt) 
select replace(convert(varchar(10), dt, 104),'.','') 
,  dt 
from cte 
option (maxrecursion 0); 

당신은 다음과 같은 유효한 날짜를 확인할 수 있습니다 :이 예는 1900에서 2100에 날짜와 ValidDates라는 테이블을 생성

select @output_dt = dt from ValidDates where date_str = @input_dt 
+0

begin try는 불행히도 사용자 정의 된 sql 함수 내에서 사용할 수 없기 때문에 불행히도 옵션을 벗어났습니다 ("부작용 연산자의 잘못된 사용"오류 발생) – Jaska

+0

조회 테이블을 생성하면 확실히 작동합니다. ,하지만 솔루션은 나에게 원자 폭탄으로 나비를 죽이는 것과 같은 소리가납니다. :) – Jaska