Thread: check date validity

check date validity

From
"LitelWang"
Date:
I need this function :

CheckDate('2002-02-29') return false
CheckDate('2002-02-28') return true

How to write ?

Thanks for any advice .



Re: check date validity

From
Harald Fuchs
Date:
In article <20040116054046.E4E751C173283@smtp.vip.163.com>,
"LitelWang" <wlxyk@vip.163.com> writes:

> I need this function :
> CheckDate('2002-02-29') return false
> CheckDate('2002-02-28') return true

Why would you want to do that?  Just try to insert '2002-02-29' into
your DATE column, and PostgreSQL will complain.

Re: check date validity

From
Jeff Eckermann
Date:
--- Harald Fuchs <hf99@protecting.net> wrote:
> In article
> <20040116054046.E4E751C173283@smtp.vip.163.com>,
> "LitelWang" <wlxyk@vip.163.com> writes:
>
> > I need this function :
> > CheckDate('2002-02-29') return false
> > CheckDate('2002-02-28') return true
>
> Why would you want to do that?  Just try to insert
> '2002-02-29' into
> your DATE column, and PostgreSQL will complain.

That will cause the whole transaction to abort, which
is probably not what is wanted.

I don't know any way around this in Postgres.  Best to
check this in application code.

__________________________________
Do you Yahoo!?
Yahoo! Hotjobs: Enter the "Signing Bonus" Sweepstakes
http://hotjobs.sweepstakes.yahoo.com/signingbonus

Re: check date validity

From
Joe Conway
Date:
Jeff Eckermann wrote:
>>>I need this function :
>>>CheckDate('2002-02-29') return false
>>>CheckDate('2002-02-28') return true
>>
>>Why would you want to do that?  Just try to insert
>>'2002-02-29' into
>>your DATE column, and PostgreSQL will complain.
>
> That will cause the whole transaction to abort, which
> is probably not what is wanted.
>
> I don't know any way around this in Postgres.  Best to
> check this in application code.

You could give this a try:
http://www.joeconway.com/str_validate.tar.gz

Drop in the contrib directory of a postgres source tree, untar, and then
make and install like any other contrib.

Here's some info from the README:
==================================
str_valid(text, oid) - returns true or false

Synopsis

str_valid(<string> text, <type_oid> oid)

Inputs

   string
     The string representing the value to be cast to a given data type

   type_oid
     The oid of the type to which <string> should be castable

     Note: it may be convenient to use the form 'typename'::regtype to
           represent the type oid.

Outputs

   Returns 't' (true) if the cast will succeed, 'f' (false) if it will fail

Limitations

   Currently the only supported data types are:
     - date
     - timestamp
     - interval

Example usage

regression=# select str_valid('yesterday','timestamp'::regtype);
  str_valid
-----------
  t
(1 row)

regression=# select str_valid('next month','interval'::regtype);
  str_valid
-----------
  f
(1 row)


===================

HTH,

Joe



Re: check date validity

From
Rich Hall
Date:
This may be ham handed or overkill but I had the same problem, I didn't
want to TRY to put an invalid date into my database, so I wrote

CREATE FUNCTION "rick"."f_u_is_date" (varchar) RETURNS boolean AS'
-- FUNCTION f_u_Is_Date -- assumes YYYYMMDDHHMMSS

DECLARE
av_Date ALIAS FOR $1;

li_Year SMALLINT;
li_Month SMALLINT;
li_Day SMALLINT;
li_Hour SMALLINT;
li_Minute SMALLINT;
li_Second SMALLINT;
li_Days_In_Month INTEGER[12] := ''{ 31, 28, 31, 30, 31, 30, 31, 31, 30,
31, 30, 31}'';

BEGIN
-- 1 length = 14
-- 2 all digits whitespace is FATAL!
IF av_Date !~ ''^[0-9]{14}$'' THEN
-- not 14 digits
RETURN False;
END IF;
-- 3 parse
li_Year := Cast( SubStr( av_Date, 1, 4 ) AS SMALLINT );
li_Month := Cast( SubStr( av_Date, 5, 2 ) AS SMALLINT );
li_Day := Cast( SubStr( av_Date, 7, 2 ) AS SMALLINT );
li_Hour := Cast( SubStr( av_Date, 9, 2 ) AS SMALLINT );
li_Minute := Cast( SubStr( av_Date, 11, 2 ) AS SMALLINT );
li_Second := Cast( SubStr( av_Date, 13, 2 ) AS SMALLINT );

-- test date parts in range
-- and days in a month
IF ( li_Second >= 0 ) AND ( li_Second <= 59 )
AND ( li_Minute >= 0 ) AND ( li_Minute <= 59 )
AND ( li_Hour >= 0 ) AND ( li_Hour <= 23 )

AND ( li_Day >= 1 ) AND ( li_Day <= li_Days_In_Month[ li_Month ] )
AND ( li_Month >= 1 ) AND ( li_Month <= 12 )
AND ( li_Year >= 2000 )
THEN
-- date parts in range
RETURN True;
ELSE
-- February and leap year is the only exception
IF ( li_Month = 2 )
AND ( li_Day = 29 )
AND ( ( ( Mod( li_Year, 4 ) = 0 )
OR ( Mod( li_Year, 400 ) = 0 ) )
AND ( Mod( li_Year, 100 ) <> 0 ) )
THEN
-- leap year, February has 29 days
RETURN True;
ELSE
-- date parts not in range
RETURN False;
END IF;
END IF;

RETURN True;
END; -- f_u_Is_Date
'LANGUAGE 'plpgsql' STABLE CALLED ON NULL INPUT SECURITY INVOKER;

LitelWang wrote:

>I need this function :
>
>CheckDate('2002-02-29') return false
>CheckDate('2002-02-28') return true
>
>How to write ?
>
>Thanks for any advice .
>
>
>



Re: check date validity

From
Bill Gribble
Date:
On Fri, 2004-01-16 at 06:58, Harald Fuchs wrote:
> In article <20040116054046.E4E751C173283@smtp.vip.163.com>,
> "LitelWang" <wlxyk@vip.163.com> writes:
> > I need this function :
> > CheckDate('2002-02-29') return false
> > CheckDate('2002-02-28') return true
>
> Why would you want to do that?  Just try to insert '2002-02-29' into
> your DATE column, and PostgreSQL will complain.

But it won't complain usefully.  It will just abort the transaction.
It's difficult to determine what went wrong when Postgres craps out,
which is at least in part why many on this list recommend duplicating
all the database validation logic in your application for EVERY type.

To me, this seems like a waste of effort, since both the application and
the DB server have to confirm that every date (for example, but applies
to every other type as well) is valid.  But I can't see how to do it any
other way, since the prevailing consensus among the PG devs seems to be
that any problem with the values of data is an application problem, not
a database problem, so don't expect to get any help from the server
other than "Sorry, that transaction is now gone.  Hope you can reproduce
the work! Have a nice day."

Thanks,
b.g.




sql to get the column names of a table

From
Alexander Antonakakis
Date:
How can I get the column names of a table with sql ?
Thanks in advance

Alexander Antonakakis


Re: sql to get the column names of a table

From
Devrim GUNDUZ
Date:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1


Hi,

On Tue, 20 Jan 2004, Alexander Antonakakis wrote:

> How can I get the column names of a table with sql ?

 SELECT tablename FROM pg_tables WHERE tablename NOT LIKE 'pg_%';

will work, I think.

Regards,
- --
Devrim GUNDUZ
devrim@gunduz.org                devrim.gunduz@linux.org.tr
            http://www.TDMSoft.com
            http://www.gunduz.org
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)

iD8DBQFADQwotl86P3SPfQ4RAo7QAKDbpCxKPhgsoMuvqYPgWIv/4Yp71ACePcd7
brSaT7Ur5cUZ9bz54bii9Qg=
=B1/n
-----END PGP SIGNATURE-----


Re: sql to get the column names of a table

From
"John Sidney-Woollett"
Date:
Devrim GUNDUZ said:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
>
> Hi,
>
> On Tue, 20 Jan 2004, Alexander Antonakakis wrote:
>
>> How can I get the column names of a table with sql ?
>
>  SELECT tablename FROM pg_tables WHERE tablename NOT LIKE 'pg_%';
>
> will work, I think.


If you want COLUMNS and not TABLES and are using 7.4 then use the views
provided in the information_schema. eg

select column_name from information_schema.columns
where table_name = 'mytable';

Look at the view, you can select all sorts of info, and filter on other
criteria too.

John Sidney-Woollett



Re: sql to get the column names of a table

From
"Eric Anderson Vianet SAO"
Date:
in postgresql

database# \d tablename

regards

Eric
----- Original Message -----
From: "Alexander Antonakakis" <motoris@sdf.lonestar.org>
To: <pgsql-general@postgresql.org>
Sent: Tuesday, January 20, 2004 7:23 AM
Subject: [GENERAL] sql to get the column names of a table


> How can I get the column names of a table with sql ?
> Thanks in advance
>
> Alexander Antonakakis
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 5: Have you checked our extensive FAQ?
>
>                http://www.postgresql.org/docs/faqs/FAQ.html