Лучший метод проверки даты varchar в Sybase (T-SQL)?

У меня есть хранимая процедура, которая принимает в качестве параметра varchar, который необходимо преобразовать как datetime для последующего использования:

SET @the_date = CAST(@date_string AS DATETIME)

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

NB: при использовании Sybase ASE 12.5.3 функция ISDATE отсутствует.

Ответов (7)

Решение

У меня похожая проблема. Вы могли бы сделать что-то вроде этого:

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

Однако в select это не работает. Он будет хорошо работать в курсоре (boo) или в логике до / после пакета SQL.

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

select convert( datetime , @date_string ) 

Обнаружил это во втором результате в 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;

Боже мой, если бы вопрос был о Microsoft SQL Server, мы были бы в деле!

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

Если формат ввода просто должен быть «ДД-МЕС-ГГГГ» и без исключений, то я думаю, что изрядная проверка была достигнута путем нарезки ввода с помощью 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

?