1 /*-------------------------------------------------------------------------
4 * Definitions for the SQL92 "timestamp" and "interval" types.
6 * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
7 * Portions Copyright (c) 1994, Regents of the University of California
9 * $Id: timestamp.h,v 1.5 2000/06/08 22:37:58 momjian Exp $
11 *-------------------------------------------------------------------------
21 * Timestamp represents absolute time.
22 * Interval represents delta time. Keep track of months (and years)
23 * separately since the elapsed time spanned is unknown until instantiated
24 * relative to an absolute time.
26 * Note that Postgres uses "time interval" to mean a bounded interval,
27 * consisting of a beginning and ending time, not a time span - thomas 97/03/20
30 typedef double Timestamp;
34 double time; /* all time units other than months and
36 int4 month; /* months and years, after time for
42 #define DT_INVALID (NAN)
44 #define DT_INVALID (DBL_MIN+DBL_MIN)
47 #define DT_NOBEGIN (-HUGE_VAL)
48 #define DT_NOEND (HUGE_VAL)
50 #define DT_NOBEGIN (-DBL_MAX)
51 #define DT_NOEND (DBL_MAX)
53 #define DT_CURRENT (DBL_MIN)
54 #define DT_EPOCH (-DBL_MIN)
56 #define TIMESTAMP_INVALID(j) do {j = DT_INVALID;} while (0)
58 #define TIMESTAMP_IS_INVALID(j) (isnan(j))
60 #define TIMESTAMP_IS_INVALID(j) (j == DT_INVALID)
63 #define TIMESTAMP_NOBEGIN(j) do {j = DT_NOBEGIN;} while (0)
64 #define TIMESTAMP_IS_NOBEGIN(j) (j == DT_NOBEGIN)
66 #define TIMESTAMP_NOEND(j) do {j = DT_NOEND;} while (0)
67 #define TIMESTAMP_IS_NOEND(j) (j == DT_NOEND)
69 #define TIMESTAMP_CURRENT(j) do {j = DT_CURRENT;} while (0)
70 #if defined(linux) && defined(__powerpc__)
71 extern int timestamp_is_current(double j);
73 #define TIMESTAMP_IS_CURRENT(j) timestamp_is_current(j)
75 #define TIMESTAMP_IS_CURRENT(j) (j == DT_CURRENT)
78 #define TIMESTAMP_EPOCH(j) do {j = DT_EPOCH;} while (0)
79 #if defined(linux) && defined(__powerpc__)
80 extern int timestamp_is_epoch(double j);
82 #define TIMESTAMP_IS_EPOCH(j) timestamp_is_epoch(j)
84 #define TIMESTAMP_IS_EPOCH(j) (j == DT_EPOCH)
87 #define TIMESTAMP_IS_RELATIVE(j) (TIMESTAMP_IS_CURRENT(j) || TIMESTAMP_IS_EPOCH(j))
88 #define TIMESTAMP_NOT_FINITE(j) (TIMESTAMP_IS_INVALID(j) \
89 || TIMESTAMP_IS_NOBEGIN(j) || TIMESTAMP_IS_NOEND(j))
90 #define TIMESTAMP_IS_RESERVED(j) (TIMESTAMP_IS_RELATIVE(j) || TIMESTAMP_NOT_FINITE(j))
92 #define INTERVAL_INVALID(j) do {(j).time = DT_INVALID;} while (0)
94 #define INTERVAL_IS_INVALID(j) (isnan((j).time))
96 #define INTERVAL_IS_INVALID(j) ((j).time == DT_INVALID)
98 #define INTERVAL_NOT_FINITE(j) INTERVAL_IS_INVALID(j)
100 #define TIME_PREC_INV 1000000.0
101 #define JROUND(j) (rint(((double) (j))*TIME_PREC_INV)/TIME_PREC_INV)
105 * timestamp.c prototypes
108 extern Timestamp *timestamp_in(char *str);
109 extern char *timestamp_out(Timestamp *dt);
110 extern bool timestamp_eq(Timestamp *dt1, Timestamp *dt2);
111 extern bool timestamp_ne(Timestamp *dt1, Timestamp *dt2);
112 extern bool timestamp_lt(Timestamp *dt1, Timestamp *dt2);
113 extern bool timestamp_le(Timestamp *dt1, Timestamp *dt2);
114 extern bool timestamp_ge(Timestamp *dt1, Timestamp *dt2);
115 extern bool timestamp_gt(Timestamp *dt1, Timestamp *dt2);
116 extern bool timestamp_finite(Timestamp *timestamp);
117 extern int timestamp_cmp(Timestamp *dt1, Timestamp *dt2);
118 extern Timestamp *timestamp_smaller(Timestamp *dt1, Timestamp *dt2);
119 extern Timestamp *timestamp_larger(Timestamp *dt1, Timestamp *dt2);
121 extern Interval *interval_in(char *str);
122 extern char *interval_out(Interval *span);
123 extern bool interval_eq(Interval *span1, Interval *span2);
124 extern bool interval_ne(Interval *span1, Interval *span2);
125 extern bool interval_lt(Interval *span1, Interval *span2);
126 extern bool interval_le(Interval *span1, Interval *span2);
127 extern bool interval_ge(Interval *span1, Interval *span2);
128 extern bool interval_gt(Interval *span1, Interval *span2);
129 extern bool interval_finite(Interval *span);
130 extern int interval_cmp(Interval *span1, Interval *span2);
131 extern Interval *interval_smaller(Interval *span1, Interval *span2);
132 extern Interval *interval_larger(Interval *span1, Interval *span2);
134 extern text *timestamp_text(Timestamp *timestamp);
135 extern Timestamp *text_timestamp(text *str);
136 extern text *interval_text(Interval *interval);
137 extern Interval *text_interval(text *str);
138 extern Timestamp *timestamp_trunc(text *units, Timestamp *timestamp);
139 extern Interval *interval_trunc(text *units, Interval *interval);
140 extern float64 timestamp_part(text *units, Timestamp *timestamp);
141 extern float64 interval_part(text *units, Interval *interval);
142 extern text *timestamp_zone(text *zone, Timestamp *timestamp);
144 extern Interval *interval_um(Interval *span);
145 extern Interval *interval_pl(Interval *span1, Interval *span2);
146 extern Interval *interval_mi(Interval *span1, Interval *span2);
147 extern Interval *interval_mul(Interval *span1, float8 *factor);
148 extern Interval *mul_d_interval(float8 *factor, Interval *span1);
149 extern Interval *interval_div(Interval *span1, float8 *factor);
151 extern Interval *timestamp_mi(Timestamp *dt1, Timestamp *dt2);
152 extern Timestamp *timestamp_pl_span(Timestamp *dt, Interval *span);
153 extern Timestamp *timestamp_mi_span(Timestamp *dt, Interval *span);
154 extern Interval *timestamp_age(Timestamp *dt1, Timestamp *dt2);
155 extern bool overlaps_timestamp(Timestamp *dt1, Timestamp *dt2, Timestamp *dt3, Timestamp *dt4);
157 extern int tm2timestamp(struct tm * tm, double fsec, int *tzp, Timestamp *dt);
158 extern int timestamp2tm(Timestamp dt, int *tzp, struct tm * tm, double *fsec, char **tzn);
160 extern Timestamp SetTimestamp(Timestamp timestamp);
161 extern Timestamp *now(void);
163 #endif /* TIMESTAMP_H */