2008-08-12 16 views
2

У меня есть хранимая процедура, которая принимает в качестве параметра а VarChar который должен быть отлит как DateTime для последующего использования:Лучший способ для валидации даты varchar в Sybase (T-SQL)?

SET @the_date = CAST(@date_string AS DATETIME) 

Я ожидаю строку даты поставляются в формате «DD-MON-YYYY», но в попытке защитить код, если по какой-то причине он не может быть успешно выполнен, я хочу по умолчанию указать системную дату и продолжить. В PL/SQL я мог бы использовать обработку исключений для этого, и я мог бы сделать это довольно легко с помощью регулярных выражений, но ограниченное совпадение шаблонов, поддерживаемое Sybase из коробки, не позволяет мне делать это, и я не могу полагаться на сторонних библиотек или расширений. Есть ли простой способ сделать это в T-SQL?

NB: с помощью Sybase ASE 12.5.3, нет функции

ответ

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.

0

IsDate Найдено this in the second result в 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) 
+0

IsDate не является допустимой функцией в Sybase – ninesided 2009-06-04 01:42:49

+0

Как вы собираетесь голосовать за меня за то, что вы добавили после факта. И после того, как я ответил на вопрос.Единственным идентификатором, который у вас был, был T-SQL, который наиболее широко используется в Microsoft SQL Server, который поддерживает ISDATE. Плохой этикет. – 2009-06-04 12:05:59

+0

Я думал, что цель голосования - указать ответ, который не помог, помогая ответам, которые помогли подняться на вершину, это не означало, что небольшое – ninesided 2009-06-05 12:55:19

0

Убедитесь, что SQL Server знает порядок дни, месяцы и годы в вашей строке, выполнив

SET DATEFORMAT mdy; 
1

Боже мой, если речь шла о Microsoft SQL Server, то мы были бы в бизнес!

Sybase, к сожалению, представляет собой целую базу данных в эти дни, поскольку примерно в 1997 году, по сути, дается или занимает год.

Если входной формат просто должен быть «DD-MON-YYYY» и никаких исключений, то я думаю, что справедливая сумма проверки была достигнута путем нарезки ввода с использованием SUBSTR(), после того, как сначала сделали некоторые простые вещи, таких как проверка длины.

Я думал, что недавние выпуски Sybase (например, SQL Anywhere 11) поддерживают регулярное выражение, хотя прошло некоторое время, так как мне пришлось страдать от T-SQL. Некоторый поиск в Google вызывает у меня больше сомнений.

1

Кажется, вы собираетесь застревать самостоятельно.

Возможно, вы можете использовать this в качестве отправной точки.

0

Вы попробовали convert вместо cast?

select convert(datetime , @date_string) 
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 

?

 Смежные вопросы

  • Нет связанных вопросов^_^