Cea mai bună metodă de validare a datei varchar în Sybase (T-SQL)?

Am o procedură stocată care ia ca parametru un varchar care trebuie să fie exprimat ca datetime pentru o utilizare ulterioară:

SET @the_date = CAST(@date_string AS DATETIME)

Mă aștept ca șirul de date să fie furnizat în formatul "DD-MON-AAAA", dar într-un efort de a codifica defensiv, dacă dintr-un anumit motiv nu poate fi exprimat cu succes, vreau să defecteze data sistemului și continua. În PL/SQL aș putea folosi manipularea excepțiilor pentru a realiza acest lucru și aș putea face acest lucru destul de ușor și cu expresii regulate, însă modelul limitat de potrivire susținut din cutie de Sybase nu mă lasă să fac acest lucru și nu mă pot baza pe biblioteci sau extensii terțe părți. Există o modalitate simplă de a face acest lucru în T-SQL?

NB: utilizând Sybase ASE 12.5.3, nu există nici o funcție ISDATE

0
fr hi bn

7 răspunsuri

S-a găsit acest lucru în cel de-al doilea rezultat în Google când căutați "validarea șirului de date 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)
0
adăugat
Cum o să mă votezi pentru ceva pe care l-ai adăugat după fapt. Și după ce am răspuns la întrebare. Singurul identificator pe care l-ați avut a fost T-SQL, care este cel mai popular în Microsoft SQL Server, care suportă ISDATE. Bad etichetă.
adăugat autor Nick Berardi, sursa
Ei bine, scopul este de a răspunde la postul care a fost postat. Am făcut asta. Și apoi ai schimbat-o. Nu e vina mea.
adăugat autor Nick Berardi, sursa
IsDate nu este o funcție valabilă în Sybase
adăugat autor ninesided, sursa
Am crezut că scopul votării a fost să indice un răspuns care nu a ajutat, ajutând răspunsurile care au ajutat să se ridice la vârf, nu era o ușoară
adăugat autor ninesided, sursa
nu o puteți revoca decât dacă vă editați postarea
adăugat autor ninesided, sursa

Asigurați-vă că SQL Server cunoaște ordinea zilelor, lunilor și anilor în șirul dvs. executând

SET DATEFORMAT mdy;
0
adăugat
Nu sunt atât de îngrijorat de ordonarea părților date, mai mult despre valabilitatea șirului de date în sine. adică nu vreau să explodeze când treceți în '32 -DEC-2009 ', vreau să-l în mod implicit la data curentă a sistemului.
adăugat autor ninesided, sursa

Bunătatea mea, dacă întrebarea era despre Microsoft SQL Server, atunci am fi fost în afaceri!

Sybase, din păcate, este o bază de date integrală în aceste zile, deoarece în jurul anului 1997, de fapt, dați sau luați un an.

Dacă formatul de intrare este pur și simplu "DD-MON-AAAA" și nu există excepții, atunci cred că s-ar obține o valabilitate corectă prin împărțirea intrării folosind SUBSTR (), după ce ați făcut mai întâi câteva lucruri simple, cum ar fi verificarea lungimii .

Am crezut că versiunile recente ale Sybase (SQL Anywhere 11, de exemplu) au suport pentru expresii regulate, totuși, deși a trecut ceva vreme de când am avut de suferit T-SQL. Unele googling mă lasă mult mai îndoielnice.

0
adăugat

Ați încercat convert în loc de cast ?

select convert( datetime , @date_string ) 
0
adăugat
da, folosind convert nu face nici o diferență
adăugat autor ninesided, sursa

Se pare că o să fiți blocați pe cont propriu.

You could probably use this as a starting point.

0
adăugat

Am o problemă similară. S-ar putea să reușești să faci așa ceva:

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

Cu toate acestea, acest lucru nu funcționează bine într-o selecție. Acesta va funcționa bine într-un cursor (boo) sau în logică înainte/după un lot SQL.

0
adăugat
Ea funcționează suficient de bine pentru nevoile mele, mulțumesc!
adăugat autor ninesided, sursa

Nu puteți face așa ceva:

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
adăugat
care nu ar asigura că ceea ce primești este o dată validă, totuși, aș putea trece 99-AAA-9999 la funcție și ar trece acest simplu control. Puteți face mai sofisticat, cu o declarație de caz mai mare, dar atunci când începeți să vă gândiți la anii de salt și care luni au 30/31 zile devine greu.
adăugat autor ninesided, sursa
de acord, este doar o validare simplă, nu este reală IsDate (), dacă vă convine, puteți încerca să convertiți textul furnizat în datatime și verificați dacă conversia a reușit prin verificarea variabilei de eroare @@, dar după cum am spus, este jumătate -soluţie. noroc.
adăugat autor B0rG, sursa