Vra

Ek het 'n gestoor proses wat neem as sy parameter 'n varchar wat nodig as om buite gegooi 'n date time vir latere gebruik:

SET @the_date = CAST(@date_string AS DATETIME)

Ek verwag die datum string te verskaf in die formaat "DD-MON-YYYY", maar in 'n poging om defensief Code, as vir een of ander rede kan dit nie suksesvol gegooi, ek wil die standaard van die datum stelsel en voortgaan. In PL / SQL kon ek hantering van uitsonderings te gebruik om dit te bereik en ek kon dit redelik maklik te doen met gereelde uitdrukkings, maar die beperkte patroonpassing ondersteun uit die boks deur Sybase nie laat my dit doen en ek kan nie staatmaak op derdepartybiblioteke of uitbreidings. Is daar 'n maklike manier om dit te doen in T-SQL?

NB: die gebruik van Sybase ASE 12.5.3 Daar is geen ISDATE funksie

Was dit nuttig?

Oplossing

Ek het 'n soortgelyke probleem. Jy kan in staat wees om so iets te doen:

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

Dit beteken egter nie goed werk in 'n uitgesoekte. Dit sal goed werk in 'n wyser (boo) of in logika voor / na 'n SQL joernaal.

Ander wenke

My goedheid, as die vraag was oor Microsoft SQL Server dan sou ons is in die besigheid!

Sybase, ongelukkig, is 'n hele 'nAnder databasis deesdae, sedert ongeveer 1997, in werklikheid, gee of neem 'n jaar.

As die insette formaat moet eenvoudig wees 'DD-MON-YYYY en geen uitsonderings, dan dink ek dat 'n billike bedrag van validering is bereik deur sny die toevoer met behulp van SUBSTR (), nadat die eerste besig met 'n eenvoudige dinge, soos as die nagaan van lengte.

Ek het gedink dat onlangse vrystellings van Sybase (SQL Anywhere 11, byvoorbeeld) het regular expression ondersteuning egter hoewel dit was 'n rukkie sedert ek moes ly T-SQL. Sommige googlen laat my in plaas van meer twyfel.

Dit lyk jy gaan vas te rol jou eie.

Jy kan waarskynlik gebruik hierdie as 'n beginpunt.

Kan jy nie iets doen soos volg:

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

?

Resultate hierdie in die tweede gevolg in Google wanneer jy soek vir" bekragtig datum 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)

Maak seker SQL Server weet die einde van dae, maande en jare in jou string deur die uitvoering

SET DATEFORMAT mdy;

Het jy probeer convert in plaas van cast?

select convert( datetime , @date_string ) 
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top