2

我有一个存储过程,它的参数是一个varchar,需要将其转换为日期时间以供以后使用:

SET @the_date = CAST(@date_string AS DATETIME)

我希望日期字符串以“DD-MON-YYYY”格式提供,但为了进行防御性编码,如果由于某种原因无法成功转换,我想默认为系统日期和继续。在 PL/SQL 中,我可以使用异常处理来实现这一点,我也可以使用正则表达式相当容易地做到这一点,但是 Sybase 开箱即用支持的有限模式匹配不允许我这样做,我不能依赖第三方库或扩展。在 T-SQL 中有一种简单的方法吗?

注意:使用 Sybase ASE 12.5.3,没有 ISDATE 功能

4

7 回答 7

1

我的天哪,如果问题是关于 Microsoft SQL Server 的,那么我们就一直在做生意!

可悲的是,Sybase 现在是一个完整的“另一个数据库”,大约从 1997 年开始,事实上,大约一年。

如果输入格式必须是“DD-MON-YYYY”并且没有例外,那么我认为在首先做一些简单的事情之后,使用 SUBSTR() 对输入进行切片可以实现相当多的验证,例如检查长度.

我认为最近的 Sybase 版本(例如 SQL Anywhere 11)支持正则表达式,尽管我已经有一段时间没有忍受 T-SQL 了。一些谷歌搜索让我更加怀疑。

于 2008-08-12T16:40:18.533 回答
1

看来你会被困在自己身上。

您可能可以以此为起点。

于 2008-08-12T17:50:45.193 回答
1

我有一个类似的问题。您可能可以执行以下操作:

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 批处理之前/之后的逻辑中很好地工作。

于 2009-06-02T21:10:00.147 回答
1

你不能做这样的事情:

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

?

于 2009-06-12T17:16:27.233 回答
0

在搜索“验证日期字符串 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)
于 2008-08-12T16:25:50.903 回答
0

通过执行确保 SQL Server 知道字符串中的天、月和年的顺序

SET DATEFORMAT mdy;
于 2008-08-12T16:29:56.947 回答
0

你试过convert代替cast吗?

select convert( datetime , @date_string ) 
于 2009-06-02T21:25:59.677 回答