]> granicus.if.org Git - postgresql/blob - src/include/utils/dt.h
Massive commit to run PGINDENT on all *.c and *.h files.
[postgresql] / src / include / utils / dt.h
1 /*-------------------------------------------------------------------------
2  *
3  * dt.h--
4  *        Definitions for the date/time and other date/time support code.
5  *        The support code is shared with other date data types,
6  *         including abstime, reltime, date, and time.
7  *
8  *
9  * Copyright (c) 1994, Regents of the University of California
10  *
11  * $Id: dt.h,v 1.19 1997/09/07 05:02:19 momjian Exp $
12  *
13  *-------------------------------------------------------------------------
14  */
15 #ifndef DT_H
16 #define DT_H
17
18 #include <time.h>
19 #include <math.h>
20
21 /*
22  * DateTime represents absolute time.
23  * TimeSpan represents delta time. Keep track of months (and years)
24  *      separately since the elapsed time spanned is unknown until instantiated
25  *      relative to an absolute time.
26  *
27  * Note that Postgres uses "time interval" to mean a bounded interval,
28  *      consisting of a beginning and ending time, not a time span - tgl 97/03/20
29  */
30
31 typedef double  DateTime;
32
33 typedef struct
34 {
35         double                  time;           /* all time units other than months and
36                                                                  * years */
37         int4                    month;          /* months and years, after time for
38                                                                  * alignment */
39 }                               TimeSpan;
40
41
42 /* ----------------------------------------------------------------
43  *                              time types + support macros
44  *
45  * String definitions for standard time quantities.
46  *
47  * These strings are the defaults used to form output time strings.
48  * Other alternate forms are hardcoded into token tables in dt.c.
49  * ----------------------------------------------------------------
50  */
51
52 #define DAGO                    "ago"
53 #define DCURRENT                "current"
54 #define EPOCH                   "epoch"
55 #define INVALID                 "invalid"
56 #define EARLY                   "-infinity"
57 #define LATE                    "infinity"
58 #define NOW                             "now"
59 #define TODAY                   "today"
60 #define TOMORROW                "tomorrow"
61 #define YESTERDAY               "yesterday"
62 #define ZULU                    "zulu"
63
64 #define DMICROSEC               "usecond"
65 #define DMILLISEC               "msecond"
66 #define DSECOND                 "second"
67 #define DMINUTE                 "minute"
68 #define DHOUR                   "hour"
69 #define DDAY                    "day"
70 #define DWEEK                   "week"
71 #define DMONTH                  "month"
72 #define DQUARTER                "quarter"
73 #define DYEAR                   "year"
74 #define DDECADE                 "decade"
75 #define DCENTURY                "century"
76 #define DMILLENIUM              "millenium"
77 #define DA_D                    "ad"
78 #define DB_C                    "bc"
79 #define DTIMEZONE               "timezone"
80
81 /*
82  * Fundamental time field definitions for parsing.
83  *
84  *      Meridian:  am, pm, or 24-hour style.
85  *      Millenium: ad, bc
86  */
87
88 #define AM              0
89 #define PM              1
90 #define HR24    2
91
92 #define AD              0
93 #define BC              1
94
95 /*
96  * Fields for time decoding.
97  * Can't have more of these than there are bits in an unsigned int
98  *      since these are turned into bit masks during parsing and decoding.
99  */
100
101 #define RESERV  0
102 #define MONTH   1
103 #define YEAR    2
104 #define DAY             3
105 #define TIMES   4                               /* not used - thomas 1997-07-14 */
106 #define TZ              5
107 #define DTZ             6
108 #define DTZMOD  7
109 #define IGNORE  8
110 #define AMPM    9
111 #define HOUR    10
112 #define MINUTE  11
113 #define SECOND  12
114 #define DOY             13
115 #define DOW             14
116 #define UNITS   15
117 #define ADBC    16
118 /* these are only for relative dates */
119 #define AGO             17
120 #define ABS_BEFORE              18
121 #define ABS_AFTER               19
122
123 /*
124  * Token field definitions for time parsing and decoding.
125  * These need to fit into the datetkn table type.
126  * At the moment, that means keep them within [-127,127].
127  * These are also used for bit masks in DecodeDateDelta()
128  *      so actually restrict them to within [0,31] for now.
129  * - tgl 97/06/19
130  */
131
132 #define DTK_NUMBER              0
133 #define DTK_STRING              1
134
135 #define DTK_DATE                2
136 #define DTK_TIME                3
137 #define DTK_TZ                  4
138 #define DTK_AGO                 5
139
140 #define DTK_SPECIAL             6
141 #define DTK_INVALID             7
142 #define DTK_CURRENT             8
143 #define DTK_EARLY               9
144 #define DTK_LATE                10
145 #define DTK_EPOCH               11
146 #define DTK_NOW                 12
147 #define DTK_YESTERDAY   13
148 #define DTK_TODAY               14
149 #define DTK_TOMORROW    15
150 #define DTK_ZULU                16
151
152 #define DTK_DELTA               17
153 #define DTK_SECOND              18
154 #define DTK_MINUTE              19
155 #define DTK_HOUR                20
156 #define DTK_DAY                 21
157 #define DTK_WEEK                22
158 #define DTK_MONTH               23
159 #define DTK_QUARTER             24
160 #define DTK_YEAR                25
161 #define DTK_DECADE              26
162 #define DTK_CENTURY             27
163 #define DTK_MILLENIUM   28
164 #define DTK_MILLISEC    29
165 #define DTK_MICROSEC    30
166 #define DTK_DOW                 31
167
168 /*
169  * Bit mask definitions for time parsing.
170  */
171
172 #define DTK_M(t)                (0x01 << (t))
173
174 #define DTK_DATE_M              (DTK_M(YEAR) | DTK_M(MONTH) | DTK_M(DAY))
175 #define DTK_TIME_M              (DTK_M(HOUR) | DTK_M(MINUTE) | DTK_M(SECOND))
176
177 #define MAXDATELEN              47              /* maximum possible length of an input
178                                                                  * date string */
179 #define MAXDATEFIELDS   25              /* maximum possible number of fields in a
180                                                                  * date string */
181 #define TOKMAXLEN               10              /* only this many chars are stored in
182                                                                  * datetktbl */
183
184 /* keep this struct small; it gets used a lot */
185 typedef struct
186 {
187 #if defined(aix)
188         char               *token;
189 #else
190         char                    token[TOKMAXLEN];
191 #endif                                                  /* aix */
192         char                    type;
193         char                    value;          /* this may be unsigned, alas */
194 }                               datetkn;
195
196 #ifdef NAN
197 #define DT_INVALID              (NAN)
198 #else
199 #define DT_INVALID              (DBL_MIN+DBL_MIN)
200 #endif
201 #ifdef HUGE_VAL
202 #define DT_NOBEGIN              (-HUGE_VAL)
203 #define DT_NOEND                (HUGE_VAL)
204 #else
205 #define DT_NOBEGIN              (-DBL_MAX)
206 #define DT_NOEND                (DBL_MAX)
207 #endif
208 #define DT_CURRENT              (DBL_MIN)
209 #define DT_EPOCH                (-DBL_MIN)
210
211 #define DATETIME_INVALID(j)             {j = DT_INVALID;}
212 #ifdef NAN
213 #define DATETIME_IS_INVALID(j)  (isnan(j))
214 #else
215 #define DATETIME_IS_INVALID(j)  (j == DT_INVALID)
216 #endif
217
218 #define DATETIME_NOBEGIN(j)             {j = DT_NOBEGIN;}
219 #define DATETIME_IS_NOBEGIN(j)  (j == DT_NOBEGIN)
220
221 #define DATETIME_NOEND(j)               {j = DT_NOEND;}
222 #define DATETIME_IS_NOEND(j)    (j == DT_NOEND)
223
224 #define DATETIME_CURRENT(j)             {j = DT_CURRENT;}
225 #if defined(linux) && defined(PPC)
226 extern int              datetime_is_current(double j);
227
228 #define DATETIME_IS_CURRENT(j)  datetime_is_current(j)
229 #else
230 #define DATETIME_IS_CURRENT(j)  (j == DT_CURRENT)
231 #endif
232
233 #define DATETIME_EPOCH(j)               {j = DT_EPOCH;}
234 #if defined(linux) && defined(PPC)
235 extern int              datetime_is_epoch(double j);
236
237 #define DATETIME_IS_EPOCH(j)    datetime_is_epoch(j)
238 #else
239 #define DATETIME_IS_EPOCH(j)    (j == DT_EPOCH)
240 #endif
241
242 #define DATETIME_IS_RELATIVE(j) (DATETIME_IS_CURRENT(j) || DATETIME_IS_EPOCH(j))
243 #define DATETIME_NOT_FINITE(j)  (DATETIME_IS_INVALID(j) \
244                                                                 || DATETIME_IS_NOBEGIN(j) || DATETIME_IS_NOEND(j))
245 #define DATETIME_IS_RESERVED(j) (DATETIME_IS_RELATIVE(j) || DATETIME_NOT_FINITE(j))
246
247 #define TIMESPAN_INVALID(j)             {(j).time = DT_INVALID;}
248 #ifdef NAN
249 #define TIMESPAN_IS_INVALID(j)  (isnan((j).time))
250 #else
251 #define TIMESPAN_IS_INVALID(j)  ((j).time == DT_INVALID)
252 #endif
253 #define TIMESPAN_NOT_FINITE(j)  TIMESPAN_IS_INVALID(j)
254
255 #define TIME_PREC 1e-6
256 #define JROUND(j) (rint(((double) (j))/TIME_PREC)*TIME_PREC)
257
258 /*
259  * dt.c prototypes
260  */
261
262 extern DateTime *datetime_in(char *str);
263 extern char    *datetime_out(DateTime * dt);
264 extern bool             datetime_eq(DateTime * dt1, DateTime * dt2);
265 extern bool             datetime_ne(DateTime * dt1, DateTime * dt2);
266 extern bool             datetime_lt(DateTime * dt1, DateTime * dt2);
267 extern bool             datetime_le(DateTime * dt1, DateTime * dt2);
268 extern bool             datetime_ge(DateTime * dt1, DateTime * dt2);
269 extern bool             datetime_gt(DateTime * dt1, DateTime * dt2);
270 extern bool             datetime_finite(DateTime * datetime);
271 extern int              datetime_cmp(DateTime * dt1, DateTime * dt2);
272 extern DateTime *datetime_smaller(DateTime * dt1, DateTime * dt2);
273 extern DateTime *datetime_larger(DateTime * dt1, DateTime * dt2);
274
275 extern TimeSpan *timespan_in(char *str);
276 extern char    *timespan_out(TimeSpan * span);
277 extern bool             timespan_eq(TimeSpan * span1, TimeSpan * span2);
278 extern bool             timespan_ne(TimeSpan * span1, TimeSpan * span2);
279 extern bool             timespan_lt(TimeSpan * span1, TimeSpan * span2);
280 extern bool             timespan_le(TimeSpan * span1, TimeSpan * span2);
281 extern bool             timespan_ge(TimeSpan * span1, TimeSpan * span2);
282 extern bool             timespan_gt(TimeSpan * span1, TimeSpan * span2);
283 extern int              timespan_cmp(TimeSpan * span1, TimeSpan * span2);
284 extern TimeSpan *timespan_smaller(TimeSpan * span1, TimeSpan * span2);
285 extern TimeSpan *timespan_larger(TimeSpan * span1, TimeSpan * span2);
286
287 extern text    *datetime_text(DateTime * datetime);
288 extern DateTime *text_datetime(text * str);
289 extern text    *timespan_text(TimeSpan * timespan);
290 extern DateTime *datetime_trunc(text * units, DateTime * datetime);
291 extern TimeSpan *timespan_trunc(text * units, TimeSpan * timespan);
292 extern float64  datetime_part(text * units, DateTime * datetime);
293 extern float64  timespan_part(text * units, TimeSpan * timespan);
294 extern text    *datetime_zone(text * zone, DateTime * datetime);
295
296 extern TimeSpan *timespan_um(TimeSpan * span);
297 extern TimeSpan *timespan_pl(TimeSpan * span1, TimeSpan * span2);
298 extern TimeSpan *timespan_mi(TimeSpan * span1, TimeSpan * span2);
299 extern TimeSpan *timespan_div(TimeSpan * span1, float8 * arg2);
300
301 extern TimeSpan *datetime_mi(DateTime * dt1, DateTime * dt2);
302 extern DateTime *datetime_pl_span(DateTime * dt, TimeSpan * span);
303 extern DateTime *datetime_mi_span(DateTime * dt, TimeSpan * span);
304 extern TimeSpan *datetime_age(DateTime * dt1, DateTime * dt2);
305
306 extern void             GetCurrentTime(struct tm * tm);
307 extern DateTime SetDateTime(DateTime datetime);
308 extern int              tm2datetime(struct tm * tm, double fsec, int *tzp, DateTime * dt);
309
310 extern void             j2date(int jd, int *year, int *month, int *day);
311 extern int              date2j(int year, int month, int day);
312
313 extern double   time2t(const int hour, const int min, const double sec);
314
315 extern int
316 ParseDateTime(char *timestr, char *lowstr,
317                           char *field[], int ftype[], int maxfields, int *numfields);
318 extern int
319 DecodeDateTime(char *field[], int ftype[],
320                          int nf, int *dtype, struct tm * tm, double *fsec, int *tzp);
321
322 extern int
323 DecodeTimeOnly(char *field[], int ftype[], int nf,
324                            int *dtype, struct tm * tm, double *fsec);
325
326 extern int
327 DecodeDateDelta(char *field[], int ftype[],
328                                 int nf, int *dtype, struct tm * tm, double *fsec);
329
330 extern int              EncodeDateOnly(struct tm * tm, int style, char *str);
331 extern int              EncodeTimeOnly(struct tm * tm, double fsec, int style, char *str);
332 extern int              EncodeDateTime(struct tm * tm, double fsec, int *tzp, char **tzn, int style, char *str);
333 extern int              EncodeTimeSpan(struct tm * tm, double fsec, int style, char *str);
334
335 #endif                                                  /* DT_H */