1 /*------------------------------------------------------------------------- 2 * 3 * timestamp.h 4 * Definitions for the SQL "timestamp" and "interval" types. 5 * 6 * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group 7 * Portions Copyright (c) 1994, Regents of the University of California 8 * 9 * src/include/utils/timestamp.h 10 * 11 *------------------------------------------------------------------------- 12 */ 13 #ifndef TIMESTAMP_H 14 #define TIMESTAMP_H 15 16 #include "datatype/timestamp.h" 17 #include "fmgr.h" 18 #include "pgtime.h" 19 20 21 /* 22 * Macros for fmgr-callable functions. 23 * 24 * For Timestamp, we make use of the same support routines as for int64 25 * or float8. Therefore Timestamp is pass-by-reference if and only if 26 * int64 or float8 is! 27 */ 28 #ifdef HAVE_INT64_TIMESTAMP 29 30 #define DatumGetTimestamp(X) ((Timestamp) DatumGetInt64(X)) 31 #define DatumGetTimestampTz(X) ((TimestampTz) DatumGetInt64(X)) 32 #define DatumGetIntervalP(X) ((Interval *) DatumGetPointer(X)) 33 34 #define TimestampGetDatum(X) Int64GetDatum(X) 35 #define TimestampTzGetDatum(X) Int64GetDatum(X) 36 #define IntervalPGetDatum(X) PointerGetDatum(X) 37 38 #define PG_GETARG_TIMESTAMP(n) DatumGetTimestamp(PG_GETARG_DATUM(n)) 39 #define PG_GETARG_TIMESTAMPTZ(n) DatumGetTimestampTz(PG_GETARG_DATUM(n)) 40 #define PG_GETARG_INTERVAL_P(n) DatumGetIntervalP(PG_GETARG_DATUM(n)) 41 42 #define PG_RETURN_TIMESTAMP(x) return TimestampGetDatum(x) 43 #define PG_RETURN_TIMESTAMPTZ(x) return TimestampTzGetDatum(x) 44 #define PG_RETURN_INTERVAL_P(x) return IntervalPGetDatum(x) 45 #else /* !HAVE_INT64_TIMESTAMP */ 46 47 #define DatumGetTimestamp(X) ((Timestamp) DatumGetFloat8(X)) 48 #define DatumGetTimestampTz(X) ((TimestampTz) DatumGetFloat8(X)) 49 #define DatumGetIntervalP(X) ((Interval *) DatumGetPointer(X)) 50 51 #define TimestampGetDatum(X) Float8GetDatum(X) 52 #define TimestampTzGetDatum(X) Float8GetDatum(X) 53 #define IntervalPGetDatum(X) PointerGetDatum(X) 54 55 #define PG_GETARG_TIMESTAMP(n) DatumGetTimestamp(PG_GETARG_DATUM(n)) 56 #define PG_GETARG_TIMESTAMPTZ(n) DatumGetTimestampTz(PG_GETARG_DATUM(n)) 57 #define PG_GETARG_INTERVAL_P(n) DatumGetIntervalP(PG_GETARG_DATUM(n)) 58 59 #define PG_RETURN_TIMESTAMP(x) return TimestampGetDatum(x) 60 #define PG_RETURN_TIMESTAMPTZ(x) return TimestampTzGetDatum(x) 61 #define PG_RETURN_INTERVAL_P(x) return IntervalPGetDatum(x) 62 #endif /* HAVE_INT64_TIMESTAMP */ 63 64 65 #define TIMESTAMP_MASK(b) (1 << (b)) 66 #define INTERVAL_MASK(b) (1 << (b)) 67 68 /* Macros to handle packing and unpacking the typmod field for intervals */ 69 #define INTERVAL_FULL_RANGE (0x7FFF) 70 #define INTERVAL_RANGE_MASK (0x7FFF) 71 #define INTERVAL_FULL_PRECISION (0xFFFF) 72 #define INTERVAL_PRECISION_MASK (0xFFFF) 73 #define INTERVAL_TYPMOD(p,r) ((((r) & INTERVAL_RANGE_MASK) << 16) | ((p) & INTERVAL_PRECISION_MASK)) 74 #define INTERVAL_PRECISION(t) ((t) & INTERVAL_PRECISION_MASK) 75 #define INTERVAL_RANGE(t) (((t) >> 16) & INTERVAL_RANGE_MASK) 76 77 #ifdef HAVE_INT64_TIMESTAMP 78 #define TimestampTzPlusMilliseconds(tz,ms) ((tz) + ((ms) * (int64) 1000)) 79 #else 80 #define TimestampTzPlusMilliseconds(tz,ms) ((tz) + ((ms) / 1000.0)) 81 #endif 82 83 84 /* Set at postmaster start */ 85 extern TimestampTz PgStartTime; 86 87 /* Set at configuration reload */ 88 extern TimestampTz PgReloadTime; 89 90 91 /* 92 * timestamp.c prototypes 93 */ 94 95 extern Datum timestamp_in(PG_FUNCTION_ARGS); 96 extern Datum timestamp_out(PG_FUNCTION_ARGS); 97 extern Datum timestamp_recv(PG_FUNCTION_ARGS); 98 extern Datum timestamp_send(PG_FUNCTION_ARGS); 99 extern Datum timestamptypmodin(PG_FUNCTION_ARGS); 100 extern Datum timestamptypmodout(PG_FUNCTION_ARGS); 101 extern Datum timestamp_transform(PG_FUNCTION_ARGS); 102 extern Datum timestamp_scale(PG_FUNCTION_ARGS); 103 extern Datum timestamp_eq(PG_FUNCTION_ARGS); 104 extern Datum timestamp_ne(PG_FUNCTION_ARGS); 105 extern Datum timestamp_lt(PG_FUNCTION_ARGS); 106 extern Datum timestamp_le(PG_FUNCTION_ARGS); 107 extern Datum timestamp_ge(PG_FUNCTION_ARGS); 108 extern Datum timestamp_gt(PG_FUNCTION_ARGS); 109 extern Datum timestamp_finite(PG_FUNCTION_ARGS); 110 extern Datum timestamp_cmp(PG_FUNCTION_ARGS); 111 extern Datum timestamp_sortsupport(PG_FUNCTION_ARGS); 112 extern Datum timestamp_hash(PG_FUNCTION_ARGS); 113 extern Datum timestamp_smaller(PG_FUNCTION_ARGS); 114 extern Datum timestamp_larger(PG_FUNCTION_ARGS); 115 116 extern Datum timestamp_eq_timestamptz(PG_FUNCTION_ARGS); 117 extern Datum timestamp_ne_timestamptz(PG_FUNCTION_ARGS); 118 extern Datum timestamp_lt_timestamptz(PG_FUNCTION_ARGS); 119 extern Datum timestamp_le_timestamptz(PG_FUNCTION_ARGS); 120 extern Datum timestamp_gt_timestamptz(PG_FUNCTION_ARGS); 121 extern Datum timestamp_ge_timestamptz(PG_FUNCTION_ARGS); 122 extern Datum timestamp_cmp_timestamptz(PG_FUNCTION_ARGS); 123 124 extern Datum make_timestamp(PG_FUNCTION_ARGS); 125 extern Datum make_timestamptz(PG_FUNCTION_ARGS); 126 extern Datum make_timestamptz_at_timezone(PG_FUNCTION_ARGS); 127 extern Datum float8_timestamptz(PG_FUNCTION_ARGS); 128 129 extern Datum timestamptz_eq_timestamp(PG_FUNCTION_ARGS); 130 extern Datum timestamptz_ne_timestamp(PG_FUNCTION_ARGS); 131 extern Datum timestamptz_lt_timestamp(PG_FUNCTION_ARGS); 132 extern Datum timestamptz_le_timestamp(PG_FUNCTION_ARGS); 133 extern Datum timestamptz_gt_timestamp(PG_FUNCTION_ARGS); 134 extern Datum timestamptz_ge_timestamp(PG_FUNCTION_ARGS); 135 extern Datum timestamptz_cmp_timestamp(PG_FUNCTION_ARGS); 136 137 extern Datum interval_in(PG_FUNCTION_ARGS); 138 extern Datum interval_out(PG_FUNCTION_ARGS); 139 extern Datum interval_recv(PG_FUNCTION_ARGS); 140 extern Datum interval_send(PG_FUNCTION_ARGS); 141 extern Datum intervaltypmodin(PG_FUNCTION_ARGS); 142 extern Datum intervaltypmodout(PG_FUNCTION_ARGS); 143 extern Datum interval_transform(PG_FUNCTION_ARGS); 144 extern Datum interval_scale(PG_FUNCTION_ARGS); 145 extern Datum interval_eq(PG_FUNCTION_ARGS); 146 extern Datum interval_ne(PG_FUNCTION_ARGS); 147 extern Datum interval_lt(PG_FUNCTION_ARGS); 148 extern Datum interval_le(PG_FUNCTION_ARGS); 149 extern Datum interval_ge(PG_FUNCTION_ARGS); 150 extern Datum interval_gt(PG_FUNCTION_ARGS); 151 extern Datum interval_finite(PG_FUNCTION_ARGS); 152 extern Datum interval_cmp(PG_FUNCTION_ARGS); 153 extern Datum interval_hash(PG_FUNCTION_ARGS); 154 extern Datum interval_smaller(PG_FUNCTION_ARGS); 155 extern Datum interval_larger(PG_FUNCTION_ARGS); 156 extern Datum interval_justify_interval(PG_FUNCTION_ARGS); 157 extern Datum interval_justify_hours(PG_FUNCTION_ARGS); 158 extern Datum interval_justify_days(PG_FUNCTION_ARGS); 159 extern Datum make_interval(PG_FUNCTION_ARGS); 160 161 extern Datum timestamp_trunc(PG_FUNCTION_ARGS); 162 extern Datum interval_trunc(PG_FUNCTION_ARGS); 163 extern Datum timestamp_part(PG_FUNCTION_ARGS); 164 extern Datum interval_part(PG_FUNCTION_ARGS); 165 extern Datum timestamp_zone_transform(PG_FUNCTION_ARGS); 166 extern Datum timestamp_zone(PG_FUNCTION_ARGS); 167 extern Datum timestamp_izone_transform(PG_FUNCTION_ARGS); 168 extern Datum timestamp_izone(PG_FUNCTION_ARGS); 169 extern Datum timestamp_timestamptz(PG_FUNCTION_ARGS); 170 171 extern Datum timestamptz_in(PG_FUNCTION_ARGS); 172 extern Datum timestamptz_out(PG_FUNCTION_ARGS); 173 extern Datum timestamptz_recv(PG_FUNCTION_ARGS); 174 extern Datum timestamptz_send(PG_FUNCTION_ARGS); 175 extern Datum timestamptztypmodin(PG_FUNCTION_ARGS); 176 extern Datum timestamptztypmodout(PG_FUNCTION_ARGS); 177 extern Datum timestamptz_scale(PG_FUNCTION_ARGS); 178 extern Datum timestamptz_timestamp(PG_FUNCTION_ARGS); 179 extern Datum timestamptz_zone(PG_FUNCTION_ARGS); 180 extern Datum timestamptz_izone(PG_FUNCTION_ARGS); 181 extern Datum timestamptz_timestamptz(PG_FUNCTION_ARGS); 182 183 extern Datum interval_um(PG_FUNCTION_ARGS); 184 extern Datum interval_pl(PG_FUNCTION_ARGS); 185 extern Datum interval_mi(PG_FUNCTION_ARGS); 186 extern Datum interval_mul(PG_FUNCTION_ARGS); 187 extern Datum mul_d_interval(PG_FUNCTION_ARGS); 188 extern Datum interval_div(PG_FUNCTION_ARGS); 189 extern Datum interval_accum(PG_FUNCTION_ARGS); 190 extern Datum interval_combine(PG_FUNCTION_ARGS); 191 extern Datum interval_accum_inv(PG_FUNCTION_ARGS); 192 extern Datum interval_avg(PG_FUNCTION_ARGS); 193 194 extern Datum timestamp_mi(PG_FUNCTION_ARGS); 195 extern Datum timestamp_pl_interval(PG_FUNCTION_ARGS); 196 extern Datum timestamp_mi_interval(PG_FUNCTION_ARGS); 197 extern Datum timestamp_age(PG_FUNCTION_ARGS); 198 extern Datum overlaps_timestamp(PG_FUNCTION_ARGS); 199 200 extern Datum timestamptz_pl_interval(PG_FUNCTION_ARGS); 201 extern Datum timestamptz_mi_interval(PG_FUNCTION_ARGS); 202 extern Datum timestamptz_age(PG_FUNCTION_ARGS); 203 extern Datum timestamptz_trunc(PG_FUNCTION_ARGS); 204 extern Datum timestamptz_part(PG_FUNCTION_ARGS); 205 206 extern Datum now(PG_FUNCTION_ARGS); 207 extern Datum statement_timestamp(PG_FUNCTION_ARGS); 208 extern Datum clock_timestamp(PG_FUNCTION_ARGS); 209 210 extern Datum pg_postmaster_start_time(PG_FUNCTION_ARGS); 211 extern Datum pg_conf_load_time(PG_FUNCTION_ARGS); 212 213 extern Datum generate_series_timestamp(PG_FUNCTION_ARGS); 214 extern Datum generate_series_timestamptz(PG_FUNCTION_ARGS); 215 216 /* Internal routines (not fmgr-callable) */ 217 218 extern TimestampTz GetCurrentTimestamp(void); 219 extern void TimestampDifference(TimestampTz start_time, TimestampTz stop_time, 220 long *secs, int *microsecs); 221 extern long TimestampDifferenceMilliseconds(TimestampTz start_time, 222 TimestampTz stop_time); 223 extern bool TimestampDifferenceExceeds(TimestampTz start_time, 224 TimestampTz stop_time, 225 int msec); 226 227 /* 228 * Prototypes for functions to deal with integer timestamps, when the native 229 * format is float timestamps. 230 */ 231 #ifndef HAVE_INT64_TIMESTAMP 232 extern int64 GetCurrentIntegerTimestamp(void); 233 extern TimestampTz IntegerTimestampToTimestampTz(int64 timestamp); 234 #else 235 #define GetCurrentIntegerTimestamp() GetCurrentTimestamp() 236 #define IntegerTimestampToTimestampTz(timestamp) (timestamp) 237 #endif 238 239 extern TimestampTz time_t_to_timestamptz(pg_time_t tm); 240 extern pg_time_t timestamptz_to_time_t(TimestampTz t); 241 242 extern const char *timestamptz_to_str(TimestampTz t); 243 244 extern int tm2timestamp(struct pg_tm * tm, fsec_t fsec, int *tzp, Timestamp *dt); 245 extern int timestamp2tm(Timestamp dt, int *tzp, struct pg_tm * tm, 246 fsec_t *fsec, const char **tzn, pg_tz *attimezone); 247 extern void dt2time(Timestamp dt, int *hour, int *min, int *sec, fsec_t *fsec); 248 249 extern int interval2tm(Interval span, struct pg_tm * tm, fsec_t *fsec); 250 extern int tm2interval(struct pg_tm * tm, fsec_t fsec, Interval *span); 251 252 extern Timestamp SetEpochTimestamp(void); 253 extern void GetEpochTime(struct pg_tm * tm); 254 255 extern int timestamp_cmp_internal(Timestamp dt1, Timestamp dt2); 256 257 /* timestamp comparison works for timestamptz also */ 258 #define timestamptz_cmp_internal(dt1,dt2) timestamp_cmp_internal(dt1, dt2) 259 260 extern int isoweek2j(int year, int week); 261 extern void isoweek2date(int woy, int *year, int *mon, int *mday); 262 extern void isoweekdate2date(int isoweek, int wday, int *year, int *mon, int *mday); 263 extern int date2isoweek(int year, int mon, int mday); 264 extern int date2isoyear(int year, int mon, int mday); 265 extern int date2isoyearday(int year, int mon, int mday); 266 267 #endif /* TIMESTAMP_H */ 268