Melhor método para validação de data varchar em Sybase (T-SQL)?
-
08-06-2019 - |
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
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 )