2008-08-12 30 views
2

Ich habe eine gespeicherte Prozedur, die als Parameter, der als zur späteren Verwendung Datetime gegossen werden muss ein varchar nimmt:Beste Methode für Varchar-Datum Validierung in Sybase (T-SQL)?

SET @the_date = CAST(@date_string AS DATETIME) 

ich das Datum Zeichenfolge erwartet im Format geliefert werden soll, "DD-MON-YYYY", aber in dem Bemühen defensiv zu codieren, wenn es aus irgendeinem Grund nicht erfolgreich übertragen werden kann, möchte ich das Systemdatum als Standard festlegen und fortfahren. In PL/SQL könnte ich die Ausnahmebehandlung verwenden, um dies zu erreichen, und ich könnte dies auch mit regulären Ausdrücken ziemlich leicht machen, aber der von Sybase standardmäßig unterstützte Mustervergleich erlaubt mir dies nicht und ich kann mich nicht darauf verlassen Bibliotheken oder Erweiterungen von Drittanbietern. Gibt es eine einfache Möglichkeit, dies in T-SQL zu tun?

NB: mit Sybase ASE 12.5.3 gibt es keine ISDATE Funktion

Antwort

1

Ich habe ein ähnliches Problem. Sie könnten in der Lage sein, so etwas zu tun:

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 

Dies ist jedoch nicht gut in einem ausgewählten funktioniert. Es funktioniert gut in einem Cursor (boo) oder in Logik vor/nach einem SQL-Batch.

+0

Es funktioniert gut genug für meine Bedürfnisse, danke! – ninesided

+0

Ich bestätige, dass es nicht in einer Auswahl funktioniert. Ich verstehe einfach nicht, was Sie mit einer "Logik vor/nach einem SQL-Batch" meinen. Was ist eine Logik in Sybase? –

0

this in the second result in Google gefunden, wenn für "validieren Datum String sql" gesucht.

----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) 
+0

IsDate ist keine gültige Funktion in Sybase – ninesided

+0

Wie werden Sie mich für etwas abstimmen, das Sie nach der Tat hinzugefügt haben. Und nachdem ich die Frage beantwortet habe.Der einzige Bezeichner, den Sie hatten, war T-SQL, das am häufigsten in Microsoft SQL Server verwendet wird, das ISDATE unterstützt. Schlechte Etikette. –

+0

Ich dachte, der Zweck des Abstimmens war, eine Antwort anzuzeigen, die nicht half, Antworten zu helfen, die geholfen haben, an die Spitze zu steigen, war es nicht als eine leichte – ninesided

0

sicher SQL Server Stellen kennt die Reihenfolge der Tage, Monate und Jahre in der Zeichenfolge durch Ausführen

SET DATEFORMAT mdy; 
+0

Ich bin nicht so besorgt um die Bestellung von Datumsteilen, mehr über die Gültigkeit der Datumszeichenkette selbst. Das heißt, ich möchte nicht, dass es explodiert, wenn Sie '32 -DEC-2009 'übergeben. Ich möchte, dass es standardmäßig auf das aktuelle Systemdatum gesetzt wird. – ninesided

1

Meine Güte, wenn die Frage über Microsoft SQL Server war dann hätten wir schon in Geschäft!

Sybase, traurig, ist eine ganze 'Nother-Datenbank in diesen Tagen, seit etwa 1997, in der Tat, geben oder nehmen ein Jahr.

Wenn das Eingabeformat einfach 'DD-MON-YYYY' und keine Ausnahmen sein muss, dann denke ich, dass eine Menge Validierung erreicht wurde, indem die Eingabe mit SUBSTR() geschnitten wurde, nachdem zuerst einige einfache Dinge gemacht wurden. wie die Länge überprüfen.

Ich dachte, dass die letzten Versionen von Sybase (zum Beispiel SQL Anywhere 11) reguläre Ausdrücke unterstützen, obwohl es schon eine Weile her ist, dass ich T-SQL erleiden musste. Etwas Googeln lässt mich eher zweifeln.

1

Es scheint, Sie werden stecken bleiben Ihre eigenen.

Sie könnten wahrscheinlich this als Ausgangspunkt verwenden.

0

Haben Sie versucht convert anstelle von cast?

select convert(datetime , @date_string) 
+0

ja, mit Convert macht keinen Unterschied – ninesided

1

Kannst du nicht etwas tun, wie folgt aus:

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 

?

+0

das würde nicht sicherstellen, dass, was Sie bekommen, ist ein gültiges Datum, aber ich könnte 99-AAA-9999 an die Funktion übergeben und es würde diese einfache Prüfung bestehen. Sie können es mit einer größeren Fallaussage komplizierter machen, aber wenn Sie anfangen, über Schaltjahre nachzudenken und welche Monate 30/31 Tage haben, wird es schwierig. – ninesided

+0

vereinbart, es ist nur einfache Validierung, nicht real IsDate(), wenn es Ihnen passt, können Sie versuchen, den gelieferten Text zu datetime zu konvertieren, und prüfen, ob die Konvertierung durch Überprüfung @@ Fehlervariable erfolgreich war, aber wie gesagt halbe Lösung. Prost. – B0rG