Frage

Ich habe eine gespeicherte Prozedur, deren Parameter a ist Varchar was als gegossen werden muss Terminzeit zur späteren Verwendung:

SET @the_date = CAST(@date_string AS DATETIME)

Ich erwarte, dass die Datumszeichenfolge im Format „TT-MON-JJJJ“ bereitgestellt wird, aber in dem Bemühen, defensiv zu codieren und die Umwandlung aus irgendeinem Grund nicht erfolgreich sein kann, möchte ich standardmäßig das Systemdatum und verwenden weitermachen.In PL/SQL könnte ich die Ausnahmebehandlung verwenden, um dies zu erreichen, und ich könnte dies auch ziemlich einfach mit regulären Ausdrücken tun, aber der eingeschränkte Mustervergleich, der standardmäßig von Sybase unterstützt wird, lässt mich das nicht zu und ich kann mich nicht darauf verlassen Bibliotheken oder Erweiterungen von Drittanbietern.Gibt es eine einfache Möglichkeit, dies in T-SQL zu tun?

Hinweis:Bei Verwendung von Sybase ASE 12.5.3 gibt es keine ISDATE-Funktion

War es hilfreich?

Lösung

Ich habe ein ähnliches Problem.Möglicherweise können Sie so etwas 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 funktioniert jedoch in einer Auswahl nicht gut.Es funktioniert gut in einem Cursor (boo) oder in der Logik vor/nach einem SQL-Batch.

Andere Tipps

Meine Güte, wenn es um Microsoft SQL Server gegangen wäre, wären wir im Geschäft gewesen!

Sybase ist heutzutage leider eine ganz andere Datenbank, seit etwa 1997, also mehr oder weniger ein Jahr.

Wenn das Eingabeformat lediglich „TT-MON-JJJJ“ und keine Ausnahmen sein muss, dann wurde meiner Meinung nach ein gutes Maß an Validierung erreicht, indem man die Eingabe mit SUBSTR() aufteilte, nachdem man zunächst einige einfache Dinge getan hatte, wie zum Beispiel die Länge überprüfte .

Ich dachte jedoch, dass neuere Versionen von Sybase (z. B. SQL Anywhere 11) reguläre Ausdrücke unterstützen, obwohl es schon eine Weile her ist, dass ich unter T-SQL leiden musste.Etwas Googeln lässt mich eher zweifeln.

Es sieht so aus, als würdest du nicht weiterkommen, wenn du deine eigenen Sachen rollst.

Du könntest es wahrscheinlich gebrauchen Das als Ausgangspunkt.

Kann man so etwas nicht machen:

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

?

Gefunden dies im zweiten Ergebnis in Google bei der Suche nach „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)

Stellen Sie durch die Ausführung sicher, dass SQL Server die Reihenfolge der Tage, Monate und Jahre in Ihrer Zeichenfolge kennt

SET DATEFORMAT mdy;

Hast du versucht convert anstatt cast?

select convert( datetime , @date_string ) 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top