验证t-sql函数内的日期时间

时间:2012-06-27 09:04:50

标签: sql sql-server

我需要在社会安全号码检查功能中验证日期。它应该接受的日期格式为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 dateformat如何。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

似乎

SELECT ISDATE('2005-05-22')SET DATEFORMAT dmy影响并返回零

即使dateformat为SELECT ISDATE('20050522')

dmy也不会受到影响,因此可以独立于数据库默认使用的任何dateformat使用

。{/ p>