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

È stato utile?

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 ) 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top