Sybase (T-SQL) 中 varchar 日期验证的最佳方法?
-
08-06-2019 - |
题
我有一个存储过程,其参数为 varchar 需要将其转换为 约会时间 供以后使用:
SET @the_date = CAST(@date_string AS DATETIME)
我期望以“DD-MON-YYYY”格式提供日期字符串,但为了防御性编码,如果由于某种原因无法成功转换,我想默认为系统日期和继续。在 PL/SQL 中,我可以使用异常处理来实现这一点,而且我也可以使用正则表达式相当轻松地做到这一点,但是 Sybase 支持的开箱即用的有限模式匹配不允许我这样做,而且我不能依赖第三方库或扩展。在 T-SQL 中是否有一种简单的方法可以做到这一点?
注意:使用Sybase ASE 12.5.3,没有ISDATE功能
解决方案
我有类似的问题。你也许可以做这样的事情:
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 批处理之前/之后的逻辑中运行良好。
其他提示
天哪,如果问题是关于 Microsoft SQL Server 的,那么我们就已经开始做生意了!
遗憾的是,自 1997 年左右(事实上,大约一年左右)以来,Sybase 现在已经完全是另一个数据库了。
如果输入格式只需为“DD-MON-YYYY”并且没有例外,那么我认为在首先执行一些简单的操作(例如检查长度)之后,通过使用 SUBSTR() 对输入进行切片来实现相当多的验证。
不过,我认为 Sybase 的最新版本(例如 SQL Anywhere 11)具有正则表达式支持,尽管我已经有一段时间不再受 T-SQL 之苦了。一些谷歌搜索让我更加怀疑。
看来你要自己动手了。
你可能可以使用 这 作为起点。
你不能做这样的事情吗:
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
?
成立 这在第二个结果中 在 Google 中搜索“验证日期字符串 sql”时。
----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;
你试过了吗 convert
代替 cast
?
select convert( datetime , @date_string )