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

这段代码将尝试转换输入。dd.mm.yyyy它首先使用convert format 104 将字符串更改为德国时间格式。它用于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 回答