Sybase(T-SQL)中进行varchar日期验证的最佳方法?
时间:2020-03-05 18:39:13 来源:igfitidea点击:
我有一个存储过程,该过程以varchar作为参数,需要将其转换为日期时间以供以后使用:
SET @the_date = CAST(@date_string AS DATETIME)
我希望以" DD-MON-YYYY"格式提供日期字符串,但是为了防御性地编码,如果由于某种原因无法成功转换,我想默认使用系统日期和继续。在PL / SQL中,我可以使用异常处理来实现此目标,我也可以使用正则表达式轻松实现这一点,但是Sybase开箱即用支持的有限模式匹配不允许我这样做,因此我不能依赖第三方库或者扩展。在T-SQL中有一种简单的方法吗?
注意:使用Sybase ASE 12.5.3时,没有ISDATE函数
解决方案
回答
搜索"验证日期字符串sql"时,在Google的第二个结果中发现了这一点。
----Invalid date SELECT ISDATE('30/2/2007') RETURNS : 0 (Zero) ----Valid date SELECT ISDATE('12/12/20007') RETURNS : 1 (ONE) ----Invalid DataType SELECT ISDATE('SQL') RETURNS : 0 (Zero)
回答
通过执行以下命令,确保SQL Server知道字符串中的天,月和年的顺序
SET DATEFORMAT mdy;
回答
我的天哪,如果问题是关于Microsoft SQL Server,那么我们已经开展业务了!
不幸的是,自从1997年左右以来,Sybase就成为了整个数据库。
如果输入格式只是必须为'DD-MON-YYYY'并且没有例外,那么我认为在首先做一些简单的事情(例如检查长度)之后,使用SUBSTR()对输入进行切片就可以实现相当多的验证。 。
我以为Sybase的最新版本(例如SQL Anywhere 11)具有正则表达式支持,尽管自从我不得不忍受T-SQL以来已经有一段时间了。一些谷歌搜索使我更加怀疑。
回答
看来我们将被困在自己的工作中。
我们可能以此为起点。
回答
我有一个类似的问题。我们可能可以执行以下操作:
SET arithabort arith_overflow off SET @the_date = CAST(@date_string AS DATETIME) IF @the_date is NULL set @the_date = getdate() SET arithabort arith_overflow on
但是,这在某些情况下效果不佳。它可以在游标(boo)或者SQL批处理之前/之后的逻辑中很好地工作。
回答
我们是否尝试过"转换"而不是"转换"?
select convert( datetime , @date_string )
回答
你不能做这样的事情:
SELECT @the_date = CASE @date_string WHEN '[0-9][0-9]-[A-Z][A-Z][A-Z]-[0-9][0-9][0-9][0-9]' THEN CONVERT(datetime, @date_string) ELSE GETDATE() END
?