Вопрос

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

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 ) 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top