Re: varchar to date
Date: Fri, 30 Nov 2001 19:06:22 -0000
Message-ID: <Xns916970F921EBCncareyspeakeasyorg_at_207.126.101.92>
[Quoted] On 28 Nov 2001, "Matt B." <gtimatt_at_home.com> spake and said:
> "longinus" <longinus_at_zeus.polsl.gliwice.pl> wro
> If you do this:
>
> to_date(min(end_date),'DD.MM.YYYY'))
>
> ...it will work w/o error because it'll find the mininum
> END_DATE first, which you know to be 15.10.2001 and since
> this is in the proper format it will not error.
Actually, it won't work correctly, since DD.MM.YYYY doesn't collate properly. The date '01.01.2030' will collate before '15.10.2001' -- probably not what the original poster wants.
You need to clean the data first. You might also consider revisiting the format in which you are storing the date. ISO 8601, _Standard for the Representation of Date and Time_, provides date/time formats that will collate properly. Dates are represented as 'YYYY-MM-DD'. The '-' separator may optionally use '.' as a separator.
Another thing to consider is a change to the schema. Put a domain constraint on the column to enforce valid date formats. Something like this (assuming the ISO 8601 format:
create table foo
( id int not null primary key ,
dtExpires varchar(10) not null
check( '####-##-##' = translate( dtExpires , '0123456789' , '##########' ) and substring(dtExpires,1,4) between '1900' and '9999' and substring(dtExpires,6,2) between '01' and '12' and substring(dtExpires,9,2) between '01' and '31' and 1 = case when to_number(substring(dtExpires,6,2)) in (04,06,09,11) then case when to_number(substring( dtExpires,9,2 )) between 01 and 30 then 1 else 0 end when to_number(substring(dtExpires,6,2)) = 02 then case when to_number( substring(dtExpires,9,2) ) between 01 and case when mod(to_number( substring( dtExpires, 1,4), 4 )) = 0 and mod(to_number( substring( dtExpires, 1,4), 400 )) not in (100,200,300) then 29 else 28 end then 1 else 0 end when to_number(substring(dtExpires,6,2)) in ( 01,02,03,05,07,08,10,12) then case when to_number(substring( dtExpires,9,2 )) between 01 and 31 then 1 else 0 end else 0 end )
The above check (domain) constraint should enforce a valid ISO- 8601 date, including correct gregorian calendar leap year rules.
--Received on Fri Nov 30 2001 - 20:06:22 CET