1 /*-------------------------------------------------------------------------
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.
9 * Copyright (c) 1994, Regents of the University of California
11 * $Id: dt.h,v 1.19 1997/09/07 05:02:19 momjian Exp $
13 *-------------------------------------------------------------------------
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.
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
31 typedef double DateTime;
35 double time; /* all time units other than months and
37 int4 month; /* months and years, after time for
42 /* ----------------------------------------------------------------
43 * time types + support macros
45 * String definitions for standard time quantities.
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 * ----------------------------------------------------------------
53 #define DCURRENT "current"
55 #define INVALID "invalid"
56 #define EARLY "-infinity"
57 #define LATE "infinity"
60 #define TOMORROW "tomorrow"
61 #define YESTERDAY "yesterday"
64 #define DMICROSEC "usecond"
65 #define DMILLISEC "msecond"
66 #define DSECOND "second"
67 #define DMINUTE "minute"
71 #define DMONTH "month"
72 #define DQUARTER "quarter"
74 #define DDECADE "decade"
75 #define DCENTURY "century"
76 #define DMILLENIUM "millenium"
79 #define DTIMEZONE "timezone"
82 * Fundamental time field definitions for parsing.
84 * Meridian: am, pm, or 24-hour style.
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.
105 #define TIMES 4 /* not used - thomas 1997-07-14 */
118 /* these are only for relative dates */
120 #define ABS_BEFORE 18
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.
140 #define DTK_SPECIAL 6
141 #define DTK_INVALID 7
142 #define DTK_CURRENT 8
147 #define DTK_YESTERDAY 13
149 #define DTK_TOMORROW 15
153 #define DTK_SECOND 18
154 #define DTK_MINUTE 19
159 #define DTK_QUARTER 24
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
169 * Bit mask definitions for time parsing.
172 #define DTK_M(t) (0x01 << (t))
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))
177 #define MAXDATELEN 47 /* maximum possible length of an input
179 #define MAXDATEFIELDS 25 /* maximum possible number of fields in a
181 #define TOKMAXLEN 10 /* only this many chars are stored in
184 /* keep this struct small; it gets used a lot */
190 char token[TOKMAXLEN];
193 char value; /* this may be unsigned, alas */
197 #define DT_INVALID (NAN)
199 #define DT_INVALID (DBL_MIN+DBL_MIN)
202 #define DT_NOBEGIN (-HUGE_VAL)
203 #define DT_NOEND (HUGE_VAL)
205 #define DT_NOBEGIN (-DBL_MAX)
206 #define DT_NOEND (DBL_MAX)
208 #define DT_CURRENT (DBL_MIN)
209 #define DT_EPOCH (-DBL_MIN)
211 #define DATETIME_INVALID(j) {j = DT_INVALID;}
213 #define DATETIME_IS_INVALID(j) (isnan(j))
215 #define DATETIME_IS_INVALID(j) (j == DT_INVALID)
218 #define DATETIME_NOBEGIN(j) {j = DT_NOBEGIN;}
219 #define DATETIME_IS_NOBEGIN(j) (j == DT_NOBEGIN)
221 #define DATETIME_NOEND(j) {j = DT_NOEND;}
222 #define DATETIME_IS_NOEND(j) (j == DT_NOEND)
224 #define DATETIME_CURRENT(j) {j = DT_CURRENT;}
225 #if defined(linux) && defined(PPC)
226 extern int datetime_is_current(double j);
228 #define DATETIME_IS_CURRENT(j) datetime_is_current(j)
230 #define DATETIME_IS_CURRENT(j) (j == DT_CURRENT)
233 #define DATETIME_EPOCH(j) {j = DT_EPOCH;}
234 #if defined(linux) && defined(PPC)
235 extern int datetime_is_epoch(double j);
237 #define DATETIME_IS_EPOCH(j) datetime_is_epoch(j)
239 #define DATETIME_IS_EPOCH(j) (j == DT_EPOCH)
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))
247 #define TIMESPAN_INVALID(j) {(j).time = DT_INVALID;}
249 #define TIMESPAN_IS_INVALID(j) (isnan((j).time))
251 #define TIMESPAN_IS_INVALID(j) ((j).time == DT_INVALID)
253 #define TIMESPAN_NOT_FINITE(j) TIMESPAN_IS_INVALID(j)
255 #define TIME_PREC 1e-6
256 #define JROUND(j) (rint(((double) (j))/TIME_PREC)*TIME_PREC)
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);
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);
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);
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);
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);
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);
310 extern void j2date(int jd, int *year, int *month, int *day);
311 extern int date2j(int year, int month, int day);
313 extern double time2t(const int hour, const int min, const double sec);
316 ParseDateTime(char *timestr, char *lowstr,
317 char *field[], int ftype[], int maxfields, int *numfields);
319 DecodeDateTime(char *field[], int ftype[],
320 int nf, int *dtype, struct tm * tm, double *fsec, int *tzp);
323 DecodeTimeOnly(char *field[], int ftype[], int nf,
324 int *dtype, struct tm * tm, double *fsec);
327 DecodeDateDelta(char *field[], int ftype[],
328 int nf, int *dtype, struct tm * tm, double *fsec);
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);