On Mon, Oct 26, 2015 at 01:58:52PM -0400, Robert Haas wrote: > Aw, you're no fun. select '1 fortnight'::interval => '14 days' would be cool.
Patch attached... :) % psql -p 5433 -d template1 -h localhost psql (9.4.5, server 9.6devel) WARNING: psql major version 9.4, server major version 9.6. Some psql features might not work. Type "help" for help. template1=# select current_date; date ------------ 2015-10-27 (1 row) template1=# select '1 fortnight'::interval; interval ---------- 14 days (1 row) template1=# select current_date + '1 fortnight'::interval; ?column? --------------------- 2015-11-10 00:00:00 (1 row) template1=# select current_date + '1.3 fortnight'::interval; ?column? --------------------- 2015-11-14 04:48:00 (1 row) template1=# select current_date + '1.3 fortnights'::interval; ?column? --------------------- 2015-11-14 04:48:00 (1 row) -- nw
diff --git a/src/backend/utils/adt/datetime.c b/src/backend/utils/adt/datetime.c index 926358e..2032fe0 100644 --- a/src/backend/utils/adt/datetime.c +++ b/src/backend/utils/adt/datetime.c @@ -186,6 +186,8 @@ static const datetkn deltatktbl[] = { {DDECADE, UNITS, DTK_DECADE}, /* "decade" relative */ {"decades", UNITS, DTK_DECADE}, /* "decades" relative */ {"decs", UNITS, DTK_DECADE}, /* "decades" relative */ + {DFORTNIGHT, UNITS, DTK_FORTNIGHT}, /* "fortnights" relative */ + {"fortnights", UNITS, DTK_FORTNIGHT}, /* "fortnights" relative */ {"h", UNITS, DTK_HOUR}, /* "hour" relative */ {DHOUR, UNITS, DTK_HOUR}, /* "hour" relative */ {"hours", UNITS, DTK_HOUR}, /* "hours" relative */ @@ -3281,6 +3283,12 @@ DecodeInterval(char **field, int *ftype, int nf, int range, tmask = DTK_M(DAY); break; + case DTK_FORTNIGHT: + tm->tm_mday += val * 14; + AdjustFractDays(fval, tm, fsec, 14); + tmask = DTK_M(WEEK); + break; + case DTK_WEEK: tm->tm_mday += val * 7; AdjustFractDays(fval, tm, fsec, 7); diff --git a/src/include/utils/datetime.h b/src/include/utils/datetime.h index e9a1ece..3641292 100644 --- a/src/include/utils/datetime.h +++ b/src/include/utils/datetime.h @@ -52,6 +52,7 @@ struct tzEntry; #define DHOUR "hour" #define DDAY "day" #define DWEEK "week" +#define DFORTNIGHT "fortnight" #define DMONTH "month" #define DQUARTER "quarter" #define DYEAR "year" @@ -181,6 +182,7 @@ struct tzEntry; #define DTK_TZ_MINUTE 35 #define DTK_ISOYEAR 36 #define DTK_ISODOW 37 +#define DTK_FORTNIGHT 38 /* diff --git a/src/test/regress/expected/interval.out b/src/test/regress/expected/interval.out index c873a99..7a72f2a 100644 --- a/src/test/regress/expected/interval.out +++ b/src/test/regress/expected/interval.out @@ -40,6 +40,12 @@ SELECT INTERVAL '1.5 weeks' AS "Ten days twelve hours"; 10 days 12:00:00 (1 row) +SELECT INTERVAL '1 fortnight' AS "Fourteen days"; + Fourteen days +--------------- + 14 days +(1 row) + SELECT INTERVAL '1.5 months' AS "One month 15 days"; One month 15 days ------------------- diff --git a/src/test/regress/sql/interval.sql b/src/test/regress/sql/interval.sql index 789c3de..285266a 100644 --- a/src/test/regress/sql/interval.sql +++ b/src/test/regress/sql/interval.sql @@ -12,6 +12,7 @@ SELECT INTERVAL '-08:00' AS "Eight hours"; SELECT INTERVAL '-1 +02:03' AS "22 hours ago..."; SELECT INTERVAL '-1 days +02:03' AS "22 hours ago..."; SELECT INTERVAL '1.5 weeks' AS "Ten days twelve hours"; +SELECT INTERVAL '1 fortnight' AS "Fourteen days"; SELECT INTERVAL '1.5 months' AS "One month 15 days"; SELECT INTERVAL '10 years -11 month -12 days +13:14' AS "9 years...";
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers