Pregunta

Tengo un procedimiento almacenado que toma como parámetro un varchar que debe ser presentado como un fecha y hora para uso posterior:

SET @the_date = CAST(@date_string AS DATETIME)

Espero que la cadena de fecha se proporcione en el formato "DD-MON-AAAA", pero en un esfuerzo por codificar de manera defensiva, si por alguna razón no se puede transmitir correctamente, quiero utilizar de forma predeterminada la fecha del sistema y continuar.En PL/SQL podría usar el manejo de excepciones para lograr esto y también podría hacerlo con bastante facilidad con expresiones regulares, pero la coincidencia de patrones limitada admitida de fábrica por Sybase no me permite hacer esto y no puedo confiar en bibliotecas o extensiones de terceros.¿Existe una forma sencilla de hacer esto en T-SQL?

NÓTESE BIEN:Al usar Sybase ASE 12.5.3, no hay función ISDATE

¿Fue útil?

Solución

Tengo un problema similar.Es posible que puedas hacer algo como esto:

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

Sin embargo, esto no funciona bien en una selección.Funcionará bien en un cursor (boo) o en lógica antes/después de un lote de SQL.

Otros consejos

¡Dios mío, si la pregunta fuera sobre Microsoft SQL Server, entonces habríamos estado en el negocio!

Sybase, lamentablemente, es una base de datos completamente diferente en estos días, desde aproximadamente 1997, de hecho, un año más o menos.

Si el formato de entrada simplemente tiene que ser 'DD-MON-AAAA' y sin excepciones, entonces creo que se logró una buena cantidad de validación dividiendo la entrada usando SUBSTR(), después de hacer primero algunas cosas simples, como verificar la longitud. .

Sin embargo, pensé que las versiones recientes de Sybase (SQL Anywhere 11, por ejemplo) tienen soporte para expresiones regulares, aunque ha pasado un tiempo desde que tuve que sufrir T-SQL.Un poco de búsqueda en Google me deja con más dudas.

Parece que te quedarás atrapado rodando el tuyo.

Probablemente podrías usar este como punto de partida.

¿No puedes hacer algo como esto?

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

?

Encontró esto en el segundo resultado en Google al buscar "validar cadena de fecha 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)

Asegúrese de que SQL Server conozca el orden de días, meses y años en su cadena ejecutando

SET DATEFORMAT mdy;

Has probado convert en lugar de cast?

select convert( datetime , @date_string ) 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top