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

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

SET @the_date = CAST(@date_string AS DATETIME)

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

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

12.08.2008 16:22:14
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

Тем не менее, это не работает хорошо в избранном. Это будет хорошо работать в курсоре (boo) или в логике до / после пакета SQL.

1
2.06.2009 21:10:00
Я подтверждаю, что это не работает в выборе. Я просто не понимаю, что вы подразумеваете под "логикой до / после пакета SQL". Что такое логика в sybase?
user280398 24.02.2010 14:31:07

Обнаружил это во втором результате в 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
12.08.2008 16:25:50
IsDate не является допустимой функцией в Sybase
ninesided 4.06.2009 01:42:49
Как вы собираетесь голосовать против меня за то, что вы добавили после факта. И после я ответил на вопрос. Единственным вашим идентификатором был T-SQL, который наиболее часто используется в Microsoft SQL Server, который поддерживает ISDATE. Плохой этикет.
Nick Berardi 4.06.2009 12:05:59
Я думал , что цель голосования пуха было указать ответ , что не сделал помощь, помогая ответы , которые действительно помог подняться на вершину, это не означало , как небольшое
ninesided 5.06.2009 12:55:19
Ну, цель состоит в том, чтобы ответить на пост, который был опубликован. Я это сделал. А потом ты изменил это. Не моя вина.
Nick Berardi 5.06.2009 20:46:47

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

SET DATEFORMAT mdy;
0
12.08.2008 16:29:56
Я не так беспокоюсь о порядке частей даты, больше о действительности самой строки даты. то есть я не хочу, чтобы он взорвался, когда вы передадите '32 -DEC-2009 ', я хочу, чтобы по умолчанию использовалась текущая системная дата.
ninesided 4.06.2009 01:44:44

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

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

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

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

1
12.08.2008 16:40:18

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

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

1
12.08.2008 17:50:45

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

select convert( datetime , @date_string ) 
0
2.06.2009 21:25:59

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

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.06.2009 17:16:27
это не гарантировало бы, что то, что вы получаете, является действительной датой, хотя я мог бы передать функции 99-AAA-9999, и она прошла бы эту простую проверку. Вы можете сделать это более изощренным с помощью более подробного описания случая, но когда вы начинаете думать о високосных годах и о том, какие месяцы имеют 30/31 дней, становится трудно.
ninesided 12.06.2009 22:32:36
согласен, это просто простая проверка, а не настоящая IsDate (), если вам это подходит, вы можете попробовать преобразовать предоставленный текст в datetime и проверить, успешно ли преобразование, проверив переменную @@ error, но, как я уже сказал, это половина -решение. веселит.
B0rG 12.06.2009 23:38:15