我有一个存储过程,其参数为 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 ) 
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top