Skip to content

Commit 84df54b

Browse files
committed
Constructors for interval, timestamp, timestamptz
Author: Pavel Stěhule, editorialized somewhat by Álvaro Herrera Reviewed-by: Tomáš Vondra, Marko Tiikkaja With input from Fabrízio de Royes Mello, Jim Nasby
1 parent af2543e commit 84df54b

File tree

14 files changed

+590
-4
lines changed

14 files changed

+590
-4
lines changed

doc/src/sgml/func.sgml

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6720,6 +6720,32 @@ SELECT SUBSTRING('XY1234Z', 'Y*?([0-9]{1,3})');
67206720
<entry><literal>2013-07-15</literal></entry>
67216721
</row>
67226722

6723+
<row>
6724+
<entry>
6725+
<indexterm>
6726+
<primary>make_interval</primary>
6727+
</indexterm>
6728+
<literal>
6729+
<function>
6730+
make_interval(<parameter>years</parameter> <type>int</type> DEFAULT 0,
6731+
<parameter>months</parameter> <type>int</type> DEFAULT 0,
6732+
<parameter>weeks</parameter> <type>int</type> DEFAULT 0,
6733+
<parameter>days</parameter> <type>int</type> DEFAULT 0,
6734+
<parameter>hours</parameter> <type>int</type> DEFAULT 0,
6735+
<parameter>mins</parameter> <type>int</type> DEFAULT 0,
6736+
<parameter>secs</parameter> <type>double precision</type> DEFAULT 0.0)
6737+
</function>
6738+
</literal>
6739+
</entry>
6740+
<entry><type>interval</type></entry>
6741+
<entry>
6742+
Create interval from years, months, weeks, days, hours, minutes and
6743+
seconds fields
6744+
</entry>
6745+
<entry><literal>make_interval(days := 10)</literal></entry>
6746+
<entry><literal>10 days</literal></entry>
6747+
</row>
6748+
67236749
<row>
67246750
<entry>
67256751
<indexterm>
@@ -6741,6 +6767,57 @@ SELECT SUBSTRING('XY1234Z', 'Y*?([0-9]{1,3})');
67416767
<entry><literal>08:15:23.5</literal></entry>
67426768
</row>
67436769

6770+
<row>
6771+
<entry>
6772+
<indexterm>
6773+
<primary>make_timestamp</primary>
6774+
</indexterm>
6775+
<literal>
6776+
<function>
6777+
make_timestamp(<parameter>year</parameter> <type>int</type>,
6778+
<parameter>month</parameter> <type>int</type>,
6779+
<parameter>day</parameter> <type>int</type>,
6780+
<parameter>hour</parameter> <type>int</type>,
6781+
<parameter>min</parameter> <type>int</type>,
6782+
<parameter>sec</parameter> <type>double precision</type>)
6783+
</function>
6784+
</literal>
6785+
</entry>
6786+
<entry><type>timestamp</type></entry>
6787+
<entry>
6788+
Create timestamp from year, month, day, hour, minute and seconds fields
6789+
</entry>
6790+
<entry><literal>make_timestamp(1-23, 7, 15, 8, 15, 23.5)</literal></entry>
6791+
<entry><literal>2013-07-15 08:15:23.5</literal></entry>
6792+
</row>
6793+
6794+
<row>
6795+
<entry>
6796+
<indexterm>
6797+
<primary>make_timestamptz</primary>
6798+
</indexterm>
6799+
<literal>
6800+
<function>
6801+
make_timestamptz(<parameter>year</parameter> <type>int</type>,
6802+
<parameter>month</parameter> <type>int</type>,
6803+
<parameter>day</parameter> <type>int</type>,
6804+
<parameter>hour</parameter> <type>int</type>,
6805+
<parameter>min</parameter> <type>int</type>,
6806+
<parameter>sec</parameter> <type>double precision</type>,
6807+
<optional> <parameter>timezone</parameter> <type>text</type> </optional>)
6808+
</function>
6809+
</literal>
6810+
</entry>
6811+
<entry><type>timestamp with time zone</type></entry>
6812+
<entry>
6813+
Create timestamp with time zone from year, month, day, hour, minute
6814+
and seconds fields. When <parameter>timezone</parameter> is not specified,
6815+
then current time zone is used.
6816+
</entry>
6817+
<entry><literal>make_timestamp(1-23, 7, 15, 8, 15, 23.5)</literal></entry>
6818+
<entry><literal>2013-07-15 08:15:23.5+01</literal></entry>
6819+
</row>
6820+
67446821
<row>
67456822
<entry>
67466823
<indexterm>

src/backend/catalog/system_views.sql

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -856,3 +856,12 @@ RETURNS SETOF RECORD
856856
LANGUAGE INTERNAL
857857
VOLATILE ROWS 1000 COST 1000
858858
AS 'pg_logical_slot_peek_binary_changes';
859+
860+
CREATE OR REPLACE FUNCTION
861+
make_interval(years int4 DEFAULT 0, months int4 DEFAULT 0, weeks int4 DEFAULT 0,
862+
days int4 DEFAULT 0, hours int4 DEFAULT 0, mins int4 DEFAULT 0,
863+
secs double precision DEFAULT 0.0)
864+
RETURNS interval
865+
LANGUAGE INTERNAL
866+
STRICT IMMUTABLE
867+
AS 'make_interval';

src/backend/utils/adt/datetime.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ static int DecodeNumberField(int len, char *str,
4040
struct pg_tm * tm, fsec_t *fsec, bool *is2digits);
4141
static int DecodeTime(char *str, int fmask, int range,
4242
int *tmask, struct pg_tm * tm, fsec_t *fsec);
43-
static int DecodeTimezone(char *str, int *tzp);
4443
static const datetkn *datebsearch(const char *key, const datetkn *base, int nel);
4544
static int DecodeDate(char *str, int fmask, int *tmask, bool *is2digits,
4645
struct pg_tm * tm);
@@ -2075,6 +2074,9 @@ DecodeTimeOnly(char **field, int *ftype, int nf,
20752074
else if (mer == PM && tm->tm_hour != HOURS_PER_DAY / 2)
20762075
tm->tm_hour += HOURS_PER_DAY / 2;
20772076

2077+
/*
2078+
* This should match the checks in make_timestamp_internal
2079+
*/
20782080
if (tm->tm_hour < 0 || tm->tm_min < 0 || tm->tm_min > MINS_PER_HOUR - 1 ||
20792081
tm->tm_sec < 0 || tm->tm_sec > SECS_PER_MINUTE ||
20802082
tm->tm_hour > HOURS_PER_DAY ||
@@ -2707,7 +2709,7 @@ DecodeNumberField(int len, char *str, int fmask,
27072709
*
27082710
* NB: this must *not* ereport on failure; see commands/variable.c.
27092711
*/
2710-
static int
2712+
int
27112713
DecodeTimezone(char *str, int *tzp)
27122714
{
27132715
int tz;

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy