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