Лучший метод проверки даты varchar в Sybase (T-SQL)?
-
08-06-2019 - |
Вопрос
У меня есть хранимая процедура, которая принимает в качестве параметра варчар который необходимо преобразовать в дата и время для дальнейшего использования:
SET @the_date = CAST(@date_string AS DATETIME)
Я ожидаю, что строка даты будет предоставлена в формате «ДД-МОН-ГГГГ», но в целях защитного кода, если по какой-то причине она не может быть успешно приведена, я хочу по умолчанию использовать системную дату и продолжать.В PL/SQL я мог бы использовать обработку исключений для достижения этой цели, и я мог бы сделать это довольно легко и с регулярными выражениями, но ограниченное сопоставление шаблонов, поддерживаемое Sybase «из коробки», не позволяет мне сделать это, и я не могу полагаться на сторонние библиотеки или расширения.Есть ли простой способ сделать это в T-SQL?
Примечание:при использовании Sybase ASE 12.5.3 функция ISDATE отсутствует
Решение
У меня аналогичная проблема.Возможно, вам удастся сделать что-то вроде этого:
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.
Другие советы
Боже мой, если бы вопрос касался Microsoft SQL Server, тогда мы бы были в деле!
Sybase, к сожалению, в наши дни представляет собой совершенно другую базу данных, примерно с 1997 года, плюс-минус год.
Если формат ввода просто должен быть «ДД-МОН-ГГГГ» и никаких исключений, то я думаю, что достаточная проверка была достигнута путем нарезки ввода с помощью SUBSTR() после предварительного выполнения некоторых простых вещей, таких как проверка длины .
Однако я думал, что последние выпуски Sybase (например, SQL Anywhere 11) имеют поддержку регулярных выражений, хотя мне уже давно не приходилось страдать от T-SQL.Некоторые поиски в Google вызывают у меня еще больше сомнений.
Кажется, вы застрянете, катаясь самостоятельно.
Вероятно, вы могли бы использовать этот в качестве отправной точки.
Не могли бы вы сделать что-то вроде этого:
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
?
Найденный это во втором результате в 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;
Ты пробовал convert
вместо cast
?
select convert( datetime , @date_string )