proposal: simple date constructor from numeric values
Hello
long time I am thinking about simple function for creating date or
timestamp values based on numeric types without necessity to create
format string.
some like ansi_date(year, month, day) and ansi_timestamp(year, month,
day, hour, minuts, sec, msec, offset)
What do you think about this idea?
Regards
Pavel Stehule
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
Hello
2013/6/29 Pavel Stehule <pavel.stehule@gmail.com>:
Hello
long time I am thinking about simple function for creating date or
timestamp values based on numeric types without necessity to create
format string.some like ansi_date(year, month, day) and ansi_timestamp(year, month,
day, hour, minuts, sec, msec, offset)What do you think about this idea?
I found so same idea was discussed three years ago
/messages/by-id/14107.1276443739@sss.pgh.pa.us
and it is a part of our ToDo: "Add function to allow the creation of
timestamps using parameters"
so we can have a functions with signatures
CREATE OR REPLACE FUNCTION construct_date(year int, month int DEFAULT
1, day int DEFAULT 1) RETURNS date;
CREATE OR REPLACE FUNCTION construct_time(hour int DEFAULT 0, mi int
DEFAULT 0, sec int DEFAULT 0, ms float DEFAULT 0.0);
CREATE OR REPLACE FUNCTION construct_timestap(year int, month int DEFAULT ....
CREATE OR REPLACE FUNCTION construct_timestamp_with_timezone(year int,
month int DEFAULT1, ...
???
Regards
Pavel Stehule
Regards
Pavel Stehule
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On 7/1/13 3:47 AM, Pavel Stehule wrote:
and it is a part of our ToDo: "Add function to allow the creation of
timestamps using parameters"so we can have a functions with signatures
I would just name them date(...), time(...), etc.
CREATE OR REPLACE FUNCTION construct_date(year int, month int DEFAULT
1, day int DEFAULT 1) RETURNS date;
I would not use default values for this one.
CREATE OR REPLACE FUNCTION construct_time(hour int DEFAULT 0, mi int
DEFAULT 0, sec int DEFAULT 0, ms float DEFAULT 0.0);
If we are using integer datetime storage, we shouldn't use floats to
construct them.
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
2013/7/1 Peter Eisentraut <peter_e@gmx.net>:
On 7/1/13 3:47 AM, Pavel Stehule wrote:
and it is a part of our ToDo: "Add function to allow the creation of
timestamps using parameters"so we can have a functions with signatures
I would just name them date(...), time(...), etc.
+1
CREATE OR REPLACE FUNCTION construct_date(year int, month int DEFAULT
1, day int DEFAULT 1) RETURNS date;I would not use default values for this one.
I have no problem with it
CREATE OR REPLACE FUNCTION construct_time(hour int DEFAULT 0, mi int
DEFAULT 0, sec int DEFAULT 0, ms float DEFAULT 0.0);If we are using integer datetime storage, we shouldn't use floats to
construct them.
so possible signature signature should be
CREATE FUNCTION time(hour int, mi int, sec int, used int) ??
and
CREATE FUNCTION timetz(hour int, mi int, sec int, isec int, tz int)
??
Regards
Pavel
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
2013/7/2 Pavel Stehule <pavel.stehule@gmail.com>:
2013/7/1 Peter Eisentraut <peter_e@gmx.net>:
On 7/1/13 3:47 AM, Pavel Stehule wrote:
and it is a part of our ToDo: "Add function to allow the creation of
timestamps using parameters"so we can have a functions with signatures
I would just name them date(...), time(...), etc.
I tested this names, and I got a syntax error for function "time"
we doesn't support real type constructors, and parser doesn't respect syntax.
so we can use a different names, or we can try to implement type
constructor functions.
Comments
Regards
Pavel
+1
CREATE OR REPLACE FUNCTION construct_date(year int, month int DEFAULT
1, day int DEFAULT 1) RETURNS date;I would not use default values for this one.
I have no problem with it
CREATE OR REPLACE FUNCTION construct_time(hour int DEFAULT 0, mi int
DEFAULT 0, sec int DEFAULT 0, ms float DEFAULT 0.0);If we are using integer datetime storage, we shouldn't use floats to
construct them.so possible signature signature should be
CREATE FUNCTION time(hour int, mi int, sec int, used int) ??
and
CREATE FUNCTION timetz(hour int, mi int, sec int, isec int, tz int)
??
Regards
Pavel
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
2013/7/3 Pavel Stehule <pavel.stehule@gmail.com>:
2013/7/2 Pavel Stehule <pavel.stehule@gmail.com>:
2013/7/1 Peter Eisentraut <peter_e@gmx.net>:
On 7/1/13 3:47 AM, Pavel Stehule wrote:
and it is a part of our ToDo: "Add function to allow the creation of
timestamps using parameters"so we can have a functions with signatures
I would just name them date(...), time(...), etc.
I tested this names, and I got a syntax error for function "time"
we doesn't support real type constructors, and parser doesn't respect syntax.
so we can use a different names, or we can try to implement type
constructor functions.
constructor function - : A niladic SQL-invoked function of which
exactly one is implicitly specified for every structured type. An
invocation of the constructor function for data type
returns a value of the most specific type such that is not null ...
as minimum for Postgres - a possibility to implement function with
same name as type name.
Regards
Pavel
.
Comments
Regards
Pavel
+1
CREATE OR REPLACE FUNCTION construct_date(year int, month int DEFAULT
1, day int DEFAULT 1) RETURNS date;I would not use default values for this one.
I have no problem with it
CREATE OR REPLACE FUNCTION construct_time(hour int DEFAULT 0, mi int
DEFAULT 0, sec int DEFAULT 0, ms float DEFAULT 0.0);If we are using integer datetime storage, we shouldn't use floats to
construct them.so possible signature signature should be
CREATE FUNCTION time(hour int, mi int, sec int, used int) ??
and
CREATE FUNCTION timetz(hour int, mi int, sec int, isec int, tz int)
??
Regards
Pavel
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On 1 July 2013 17:47, Pavel Stehule <pavel.stehule@gmail.com> wrote:
2013/6/29 Pavel Stehule <pavel.stehule@gmail.com>:
long time I am thinking about simple function for creating date or
timestamp values based on numeric types without necessity to create
format string.What do you think about this idea?
I found so same idea was discussed three years ago
I suggested something similar also:
/messages/by-id/AANLkTi=W1wtcL7qR4PuQaQ=UoabmjSUSz6QGJTUCXF-P@mail.gmail.com
The thread I linked died off without reaching a consensus about what
the functions ought to be named, although Josh and Robert were
generally supportive of the idea.
The function signatures I have been using in my own C functions are:
* date(year int, month int, day int) returns date
* datetime(year int, month int, day int, hour int, minute int, second
int) returns timestamp
Cheers,
BJ
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
Hello
2013/7/3 Brendan Jurd <direvus@gmail.com>:
On 1 July 2013 17:47, Pavel Stehule <pavel.stehule@gmail.com> wrote:
2013/6/29 Pavel Stehule <pavel.stehule@gmail.com>:
long time I am thinking about simple function for creating date or
timestamp values based on numeric types without necessity to create
format string.What do you think about this idea?
I found so same idea was discussed three years ago
I suggested something similar also:
/messages/by-id/AANLkTi=W1wtcL7qR4PuQaQ=UoabmjSUSz6QGJTUCXF-P@mail.gmail.com
The thread I linked died off without reaching a consensus about what
the functions ought to be named, although Josh and Robert were
generally supportive of the idea.The function signatures I have been using in my own C functions are:
* date(year int, month int, day int) returns date
* datetime(year int, month int, day int, hour int, minute int, second
int) returns timestamp
I am thinking so for these functions exists some consensus - minimally
for function "date"(year, month, int) - I dream about this function
ten years :)
I am not sure about "datetime":
a) we use "timestamp" name for same thing in pg
b) we can simply construct timestamp as sum of date + time, what is
little bit more practical (for me), because it doesn't use too wide
parameter list.
so my proposal is two new function "date" and "time"
but, because we doesn't support type constructor function, I don't
think so name "date" is good (in this moment)
MSSQL has function DATEFROMPARTS, TIMEFROMPARTS and DATETIMEFROMPARTS
MySQL has little bit obscure function MAKEDATE(year, dayinyear) and
MAKETIME(hour, min, sec)
Oracle and db2 has nothing similar
what do you think about names?
make_date
make_time
I don't would to use to_date, to_time functions, a) because these
functions use formatted input, b) we hold some compatibility with
Oracle.
Regards
Pavel Stehule
Cheers,
BJ
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On 3 July 2013 21:41, Pavel Stehule <pavel.stehule@gmail.com> wrote:
I am thinking so for these functions exists some consensus - minimally
for function "date"(year, month, int) - I dream about this function
ten years :)I am not sure about "datetime":
a) we use "timestamp" name for same thing in pg
b) we can simply construct timestamp as sum of date + time, what is
little bit more practical (for me), because it doesn't use too wide
parameter list.
I agree. I've got no issues with using date + time arithmetic to
build a timestamp.
what do you think about names?
make_date
make_time
I am fine with those names. 'make', 'construct', 'build', etc. are
all reasonable verbs for what the functions do, but 'make' is nice and
short, and will be familiar to people who've used a 'mktime'.
I don't would to use to_date, to_time functions, a) because these
functions use formatted input, b) we hold some compatibility with
Oracle.
Yes, I agree.
Cheers,
BJ
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
Peter Eisentraut escribi�:
On 7/1/13 3:47 AM, Pavel Stehule wrote:
CREATE OR REPLACE FUNCTION construct_time(hour int DEFAULT 0, mi int
DEFAULT 0, sec int DEFAULT 0, ms float DEFAULT 0.0);If we are using integer datetime storage, we shouldn't use floats to
construct them.
I think this is wrong. Datetime storage may be int, but since they're
microseconds underneath, we'd be unable to specify a full-resolution
timestamp if we didn't have float ms or integer �s. So either the
seconds argument should allow fractions (probably not a good idea), or
we should have another integer argument for microseconds (not
milliseconds as the above signature implies).
--
�lvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
2013/7/3 Alvaro Herrera <alvherre@2ndquadrant.com>:
Peter Eisentraut escribió:
On 7/1/13 3:47 AM, Pavel Stehule wrote:
CREATE OR REPLACE FUNCTION construct_time(hour int DEFAULT 0, mi int
DEFAULT 0, sec int DEFAULT 0, ms float DEFAULT 0.0);If we are using integer datetime storage, we shouldn't use floats to
construct them.I think this is wrong. Datetime storage may be int, but since they're
microseconds underneath, we'd be unable to specify a full-resolution
timestamp if we didn't have float ms or integer µs. So either the
seconds argument should allow fractions (probably not a good idea), or
we should have another integer argument for microseconds (not
milliseconds as the above signature implies).
so make_time(hour int, mi int, sec int, usec int DEFAULT 0)
Is good for all ?
Regards
Pavel
--
Álvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
Alvaro Herrera <alvherre@2ndquadrant.com> writes:
Peter Eisentraut escribi�:
On 7/1/13 3:47 AM, Pavel Stehule wrote:
CREATE OR REPLACE FUNCTION construct_time(hour int DEFAULT 0, mi int
DEFAULT 0, sec int DEFAULT 0, ms float DEFAULT 0.0);If we are using integer datetime storage, we shouldn't use floats to
construct them.
I think this is wrong. Datetime storage may be int, but since they're
microseconds underneath, we'd be unable to specify a full-resolution
timestamp if we didn't have float ms or integer �s. So either the
seconds argument should allow fractions (probably not a good idea), or
we should have another integer argument for microseconds (not
milliseconds as the above signature implies).
FWIW, I'd vote for allowing the seconds to be fractional. That's the
way the user perceives things:
regression=# select '12:34:56.789'::time;
time
--------------
12:34:56.789
(1 row)
Moreover, an integer microseconds argument would be a shortsighted idea
because it wires the precision limit into the function API. As long as
we make the seconds argument be float8, it will work fine even when the
underlying precision switches to, say, nanoseconds.
And lastly, those default arguments are a bad idea as well. There's no
reasonable use-case for make_time(12); that's almost certainly an error.
Even more so for make_time(). While you could make some case for
make_time(12,34) being useful, I don't think it buys much compared
to writing out make_time(12,34,0), and having just one function
signature is that much less cognitive load on users.
So my vote is for make_time(hour int, min int, sec float8).
regards, tom lane
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
2013/7/3 Tom Lane <tgl@sss.pgh.pa.us>:
Alvaro Herrera <alvherre@2ndquadrant.com> writes:
Peter Eisentraut escribió:
On 7/1/13 3:47 AM, Pavel Stehule wrote:
CREATE OR REPLACE FUNCTION construct_time(hour int DEFAULT 0, mi int
DEFAULT 0, sec int DEFAULT 0, ms float DEFAULT 0.0);If we are using integer datetime storage, we shouldn't use floats to
construct them.I think this is wrong. Datetime storage may be int, but since they're
microseconds underneath, we'd be unable to specify a full-resolution
timestamp if we didn't have float ms or integer ľs. So either the
seconds argument should allow fractions (probably not a good idea), or
we should have another integer argument for microseconds (not
milliseconds as the above signature implies).FWIW, I'd vote for allowing the seconds to be fractional. That's the
way the user perceives things:regression=# select '12:34:56.789'::time;
time
--------------
12:34:56.789
(1 row)Moreover, an integer microseconds argument would be a shortsighted idea
because it wires the precision limit into the function API. As long as
we make the seconds argument be float8, it will work fine even when the
underlying precision switches to, say, nanoseconds.And lastly, those default arguments are a bad idea as well. There's no
reasonable use-case for make_time(12); that's almost certainly an error.
Even more so for make_time(). While you could make some case for
make_time(12,34) being useful, I don't think it buys much compared
to writing out make_time(12,34,0), and having just one function
signature is that much less cognitive load on users.
I had a plan use DEFAULT only for usec parameter (if it was used).
Seconds was mandatory parameter.
After tests on prototype I think so fractional sec is better. Separate
value (in usec) is really big number - not practical for hand writing
So my vote is for make_time(hour int, min int, sec float8).
+1
Pavel
regards, tom lane
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
Hello
So my vote is for make_time(hour int, min int, sec float8).
so here is a patch
Regards
Pavel
Show quoted text
regards, tom lane
Attachments:
make_date.patchapplication/octet-stream; name=make_date.patchDownload+101-0
Hello
updated patch
+ more precious validity check
Regards
Pavel
2013/7/3 Pavel Stehule <pavel.stehule@gmail.com>:
Show quoted text
Hello
So my vote is for make_time(hour int, min int, sec float8).
so here is a patch
Regards
Pavel
regards, tom lane
Attachments:
make_date-v2.patchapplication/octet-stream; name=make_date-v2.patchDownload+148-4
There is a small inconsistency:
select time '12:30:57.123456789';
gives
12:30:57.123457
but
select make_time(12, 30, 57.123456789);
gives
12:30:57.123456
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
Hello
2013/7/12 Peter Eisentraut <peter_e@gmx.net>:
There is a small inconsistency:
select time '12:30:57.123456789';
gives
12:30:57.123457
but
select make_time(12, 30, 57.123456789);
gives
12:30:57.123456
fixed - see attached patch
Regards
Pavel
Show quoted text
Attachments:
make_date-v3.patchapplication/octet-stream; name=make_date-v3.patchDownload+148-4
Pavel Stehule escribi�:
fixed - see attached patch
There's a typo "tange" in some error messages, which has found its way
to the regression tests.
--
�lvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
Hi Pavel,
I have reviewed your patch.
Patch looks excellent and code changes match with similar constructs
elsewhere. That's great.
However, it was not applying with git apply command but able to apply it
with patch -p1 with some offsets. make and make install was smooth too.
Regression suite didn't complain as expected.
I did my own testing and din't get any issues with that. Code walk-through
was good too.
I was little bit worried as we are allowing 60 for seconds in which case we
are wrapping it to next minute and setting sec to 0. But this logic was not
true for minutes. There we are throwing an error when min = 60.
But I don't blame on this patch as other constructs does same too. Like
"select time '15:60:20'" throws an error where as "select time '15:30:60'"
does not.
However, in attached patch I have fixed the typo identified by Alvaro.
Please have a look before I submit it to the committer.
Thanks
On Sat, Jul 13, 2013 at 5:32 PM, Pavel Stehule <pavel.stehule@gmail.com>wrote:
Hello
2013/7/12 Peter Eisentraut <peter_e@gmx.net>:
There is a small inconsistency:
select time '12:30:57.123456789';
gives
12:30:57.123457
but
select make_time(12, 30, 57.123456789);
gives
12:30:57.123456
fixed - see attached patch
Regards
Pavel
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
--
Jeevan B Chalke
Principal Software Engineer, Product Development
EnterpriseDB Corporation
The Enterprise PostgreSQL Company
Phone: +91 20 30589500
Website: www.enterprisedb.com
EnterpriseDB Blog: http://blogs.enterprisedb.com/
Follow us on Twitter: http://www.twitter.com/enterprisedb
This e-mail message (and any attachment) is intended for the use of the
individual or entity to whom it is addressed. This message contains
information from EnterpriseDB Corporation that may be privileged,
confidential, or exempt from disclosure under applicable law. If you are
not the intended recipient or authorized to receive this for the intended
recipient, any use, dissemination, distribution, retention, archiving, or
copying of this communication is strictly prohibited. If you have received
this e-mail in error, please notify the sender immediately by reply e-mail
and delete this message.
Attachments:
make_date_v4.patchapplication/octet-stream; name=make_date_v4.patchDownload+147-3
Hello
thank you,
I have no comments
Regards
Pavel
2013/9/18 Jeevan Chalke <jeevan.chalke@enterprisedb.com>
Show quoted text
Hi Pavel,
I have reviewed your patch.
Patch looks excellent and code changes match with similar constructs
elsewhere. That's great.However, it was not applying with git apply command but able to apply it
with patch -p1 with some offsets. make and make install was smooth too.
Regression suite didn't complain as expected.I did my own testing and din't get any issues with that. Code walk-through
was good too.I was little bit worried as we are allowing 60 for seconds in which case we
are wrapping it to next minute and setting sec to 0. But this logic was not
true for minutes. There we are throwing an error when min = 60.But I don't blame on this patch as other constructs does same too. Like
"select time '15:60:20'" throws an error where as "select time '15:30:60'"
does not.However, in attached patch I have fixed the typo identified by Alvaro.
Please have a look before I submit it to the committer.
Thanks
On Sat, Jul 13, 2013 at 5:32 PM, Pavel Stehule <pavel.stehule@gmail.com>wrote:
Hello
2013/7/12 Peter Eisentraut <peter_e@gmx.net>:
There is a small inconsistency:
select time '12:30:57.123456789';
gives
12:30:57.123457
but
select make_time(12, 30, 57.123456789);
gives
12:30:57.123456
fixed - see attached patch
Regards
Pavel
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers--
Jeevan B Chalke
Principal Software Engineer, Product Development
EnterpriseDB Corporation
The Enterprise PostgreSQL CompanyPhone: +91 20 30589500
Website: www.enterprisedb.com
EnterpriseDB Blog: http://blogs.enterprisedb.com/
Follow us on Twitter: http://www.twitter.com/enterprisedbThis e-mail message (and any attachment) is intended for the use of the
individual or entity to whom it is addressed. This message contains
information from EnterpriseDB Corporation that may be privileged,
confidential, or exempt from disclosure under applicable law. If you are
not the intended recipient or authorized to receive this for the intended
recipient, any use, dissemination, distribution, retention, archiving, or
copying of this communication is strictly prohibited. If you have received
this e-mail in error, please notify the sender immediately by reply e-mail
and delete this message.