Il metodo migliore per la convalida della data varchar in Sybase (T-SQL)?
-
08-06-2019 - |
Domanda
Ho una procedura memorizzata che accetta come parametro a varchar che deve essere lanciato come a appuntamento per uso successivo:
SET @the_date = CAST(@date_string AS DATETIME)
Mi aspetto che la stringa della data venga fornita nel formato "GG-MON-AAAA", ma nel tentativo di codificare in modo difensivo, se per qualche motivo non può essere trasmessa con successo, desidero impostare automaticamente la data di sistema e Continua.In PL/SQL potrei usare la gestione delle eccezioni per raggiungere questo obiettivo e potrei farlo abbastanza facilmente anche con le espressioni regolari, ma la corrispondenza limitata dei modelli supportata immediatamente da Sybase non me lo consente e non posso fare affidamento su librerie o estensioni di terze parti.Esiste un modo semplice per farlo in T-SQL?
NB:utilizzando Sybase ASE 12.5.3, non è disponibile la funzione ISDATE
Soluzione
Sto riscontrando un problema simile.Potresti essere in grado di fare qualcosa del genere:
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
Tuttavia, questo non funziona bene in una selezione.Funzionerà bene in un cursore (boo) o nella logica prima/dopo un batch SQL.
Altri suggerimenti
Mio Dio, se la domanda riguardasse Microsoft SQL Server allora saremmo in affari!
Sybase, purtroppo, è un database completamente diverso al giorno d'oggi, dal 1997 circa, in effetti, un anno più o meno.
Se il formato di input deve semplicemente essere "GG-MON-AAAA" e senza eccezioni, penso che sia stata ottenuta una discreta quantità di convalida suddividendo l'input utilizzando SUBSTR(), dopo aver prima fatto alcune cose semplici, come il controllo della lunghezza .
Pensavo che le versioni recenti di Sybase (SQL Anywhere 11, ad esempio) avessero il supporto per le espressioni regolari, tuttavia, anche se è passato un po' di tempo dall'ultima volta che ho dovuto soffrire di T-SQL.Alcune ricerche su Google mi lasciano ancora più dubbi.
Sembra che rimarrai bloccato a rotolare il tuo.
Probabilmente potresti usare Questo come punto di partenza.
Non puoi fare qualcosa del genere:
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
?
Trovato questo nel secondo risultato in Google durante la ricerca di "validate date string 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)
Assicurati che SQL Server conosca l'ordine di giorni, mesi e anni nella stringa eseguendo
SET DATEFORMAT mdy;
Hai provato convert
invece di cast
?
select convert( datetime , @date_string )