我有一个存储过程,其参数为 varchar ,需要将其转换为 datetime 供以后使用:
SET @the_date = CAST(@date_string AS DATETIME)
我期望日期字符串以“DD-MON-YYYY”格式提供,但是为了防御性地编码,如果由于某种原因它无法成功投射,我想默认为系统日期并继续。在PL / SQL中,我可以使用异常处理来实现这一点,而且我也可以使用正则表达式轻松地完成此操作,但Sybase支持的开箱即用的有限模式匹配不允许我这样做而且我不能依赖第三方库或扩展。在T-SQL中有一种简单的方法吗?
注意:使用Sybase ASE 12.5.3时,没有ISDATE函数
答案 0 :(得分:1)
我的天哪,如果问题是关于Microsoft SQL Server那么我们就一直在做生意!
遗憾的是,Sybase现在是一个完整的'数据库',因为大约在1997年,事实上,给予或需要一年。如果输入格式只需要'DD-MON-YYYY'并且没有例外,那么我认为通过使用SUBSTR()对输入进行切片来实现相当多的验证,首先做一些简单的事情,比如作为检查长度。
我认为最近发布的Sybase(例如SQL Anywhere 11)具有正则表达式支持,但是,虽然我已经有一段时间了,因为我不得不忍受T-SQL。一些谷歌搜索让我更加怀疑。
答案 1 :(得分:1)
看起来你会被困在自己身上。
您可以使用this作为起点。
答案 2 :(得分: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
但是,这在选择中不起作用。它在SQL批处理之前/之后的游标(boo)或逻辑中都能很好地工作。
答案 3 :(得分: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
答案 4 :(得分:0)
在搜索“验证日期字符串sql”时在Google中找到this in the second result。
----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)
答案 5 :(得分:0)
确保SQL Server通过执行
了解字符串中Days,Months和Years的顺序SET DATEFORMAT mdy;
答案 6 :(得分:0)
您是否尝试convert
代替cast
?
select convert( datetime , @date_string )