Pergunta

Eu tenho um procedimento armazenado que leva como parâmetro um varchar que precisa ser interpretado como um data hora para uso posterior:

SET @the_date = CAST(@date_string AS DATETIME)

Estou esperando que a string de data seja fornecida no formato "DD-MON-YYYY", mas em um esforço para codificar defensivamente, se por algum motivo ela não puder ser convertida com sucesso, quero padronizar a data do sistema e continuar.Em PL/SQL, eu poderia usar o tratamento de exceções para conseguir isso e também poderia fazer isso facilmente com expressões regulares, mas a correspondência limitada de padrões suportada imediatamente pelo Sybase não me permite fazer isso e não posso confiar em bibliotecas ou extensões de terceiros.Existe uma maneira simples de fazer isso no T-SQL?

Observação:usando Sybase ASE 12.5.3, não há função ISDATE

Foi útil?

Solução

Estou tendo um problema semelhante.Você pode fazer algo assim:

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

No entanto, isso não funciona bem em uma seleção.Funcionará bem em um cursor (boo) ou na lógica antes/depois de um lote SQL.

Outras dicas

Meu Deus, se a pergunta fosse sobre o Microsoft SQL Server, estaríamos no mercado!

Sybase, infelizmente, é um banco de dados totalmente diferente hoje em dia, desde cerca de 1997, na verdade, mais ou menos um ano.

Se o formato de entrada simplesmente tiver que ser 'DD-MON-YYYY' e sem exceções, então acho que uma boa quantidade de validação foi alcançada dividindo a entrada usando SUBSTR(), depois de primeiro fazer algumas coisas simples, como verificar o comprimento .

Achei que as versões recentes do Sybase (SQL Anywhere 11, por exemplo) tivessem suporte a expressões regulares, embora já faça um tempo que não sofro com o T-SQL.Algumas pesquisas no Google me deixam com mais dúvidas.

Parece que você vai ficar preso fazendo o seu próprio.

Você provavelmente poderia usar esse como ponto de partida.

Você não pode fazer algo assim:

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

?

Encontrado isso no segundo resultado no Google ao pesquisar por "validar string de data 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)

Certifique-se de que o SQL Server conheça a ordem dos dias, meses e anos na sua string executando

SET DATEFORMAT mdy;

Você tentou convert em vez de cast?

select convert( datetime , @date_string ) 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top