1

社会保障番号チェック関数内で日付を検証する必要があります。受け入れられる日付形式はddmmyyyy、たとえば 01012000 (2000 年 1 月 1 日) です。

この文字列を に変換して関数yyyy-mm-ddを使用しようとしましIsDate()たが、問題は、SqlServer の datetimeformat が dmy のようなものである場合があり、このエラーが発生するため、関数内で「set DateFormat ymd」を使用できないことです。

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

try .. catchブロックも試しましたが、結果は同じでした。

datetimeしたがって、SqlServer の日付形式に関係なく、ユーザー関数でを検証する方法が必要です。

4

2 に答える 2

1

このコード スニペットは、入力の変換を試みます。最初に、変換形式 104dd.mm.yyyyを使用して、文字列をドイツの時刻形式に変更します。変換中のエラーを抑制するために使用します。begin try

成功した場合、日付は です@output_dt。失敗した場合は に@output_dtなりますnull

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、有効な日付でテーブルを作成できます。この例ではValidDates、1900 年から 2100 年の日付で呼び出されるテーブルを作成します。

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);

次に、次のような有効な日付を確認できます。

select @output_dt = dt from ValidDates where date_str = @input_dt
于 2012-06-27T09:16:53.713 に答える
0

のように思える

SELECT ISDATE('2005-05-22')の影響を受けSET DATEFORMAT dmy、ゼロを返します

しかし

SELECT ISDATE('20050522')dateformat がdmyの場合でも影響を受けないため、データベースでデフォルトとして使用される dateformat とは別に使用できます。

于 2012-06-27T19:43:27.273 に答える