Лучший метод для проверки даты varchar в Sybase (T-SQL)? - PullRequest
2 голосов
/ 12 августа 2008

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

SET @the_date = CAST(@date_string AS DATETIME)

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

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

Ответы [ 7 ]

1 голос
/ 03 июня 2009

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

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.

1 голос
/ 12 июня 2009

Разве вы не можете сделать что-то вроде этого:

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

1 голос
/ 12 августа 2008

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

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

1 голос
/ 12 августа 2008

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

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

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

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

0 голосов
/ 03 июня 2009

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

select convert( datetime , @date_string ) 
0 голосов
/ 12 августа 2008

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

SET DATEFORMAT mdy;
0 голосов
/ 12 августа 2008

Найдено это во втором результате в 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...