]> granicus.if.org Git - postgresql/blob - src/include/utils/timestamp.h
Add transcendental math functions (sine, cosine, etc)
[postgresql] / src / include / utils / timestamp.h
1 /*-------------------------------------------------------------------------
2  *
3  * timestamp.h
4  *        Definitions for the SQL92 "timestamp" and "interval" types.
5  *
6  * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
7  * Portions Copyright (c) 1994, Regents of the University of California
8  *
9  * $Id: timestamp.h,v 1.3 2000/04/07 13:40:12 thomas Exp $
10  *
11  *-------------------------------------------------------------------------
12  */
13 #ifndef TIMESTAMP_H
14 #define TIMESTAMP_H
15
16 #include <time.h>
17 #include <math.h>
18 #include <limits.h>
19
20 /*
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.
25  *
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
28  */
29
30 typedef double Timestamp;
31
32 typedef struct
33 {
34         double          time;   /* all time units other than months and years */
35         int4            month;  /* months and years, after time for alignment */
36 } Interval;
37
38
39 #ifdef NAN
40 #define DT_INVALID              (NAN)
41 #else
42 #define DT_INVALID              (DBL_MIN+DBL_MIN)
43 #endif
44 #ifdef HUGE_VAL
45 #define DT_NOBEGIN              (-HUGE_VAL)
46 #define DT_NOEND                (HUGE_VAL)
47 #else
48 #define DT_NOBEGIN              (-DBL_MAX)
49 #define DT_NOEND                (DBL_MAX)
50 #endif
51 #define DT_CURRENT              (DBL_MIN)
52 #define DT_EPOCH                (-DBL_MIN)
53
54 #define TIMESTAMP_INVALID(j)            {j = DT_INVALID;}
55 #ifdef NAN
56 #define TIMESTAMP_IS_INVALID(j) (isnan(j))
57 #else
58 #define TIMESTAMP_IS_INVALID(j) (j == DT_INVALID)
59 #endif
60
61 #define TIMESTAMP_NOBEGIN(j)            {j = DT_NOBEGIN;}
62 #define TIMESTAMP_IS_NOBEGIN(j) (j == DT_NOBEGIN)
63
64 #define TIMESTAMP_NOEND(j)              {j = DT_NOEND;}
65 #define TIMESTAMP_IS_NOEND(j)   (j == DT_NOEND)
66
67 #define TIMESTAMP_CURRENT(j)            {j = DT_CURRENT;}
68 #if defined(linux) && defined(__powerpc__)
69 extern int      timestamp_is_current(double j);
70
71 #define TIMESTAMP_IS_CURRENT(j) timestamp_is_current(j)
72 #else
73 #define TIMESTAMP_IS_CURRENT(j) (j == DT_CURRENT)
74 #endif
75
76 #define TIMESTAMP_EPOCH(j)              {j = DT_EPOCH;}
77 #if defined(linux) && defined(__powerpc__)
78 extern int      timestamp_is_epoch(double j);
79
80 #define TIMESTAMP_IS_EPOCH(j)   timestamp_is_epoch(j)
81 #else
82 #define TIMESTAMP_IS_EPOCH(j)   (j == DT_EPOCH)
83 #endif
84
85 #define TIMESTAMP_IS_RELATIVE(j) (TIMESTAMP_IS_CURRENT(j) || TIMESTAMP_IS_EPOCH(j))
86 #define TIMESTAMP_NOT_FINITE(j) (TIMESTAMP_IS_INVALID(j) \
87                                                                 || TIMESTAMP_IS_NOBEGIN(j) || TIMESTAMP_IS_NOEND(j))
88 #define TIMESTAMP_IS_RESERVED(j) (TIMESTAMP_IS_RELATIVE(j) || TIMESTAMP_NOT_FINITE(j))
89
90 #define INTERVAL_INVALID(j)             {(j).time = DT_INVALID;}
91 #ifdef NAN
92 #define INTERVAL_IS_INVALID(j)  (isnan((j).time))
93 #else
94 #define INTERVAL_IS_INVALID(j)  ((j).time == DT_INVALID)
95 #endif
96 #define INTERVAL_NOT_FINITE(j)  INTERVAL_IS_INVALID(j)
97
98 #define TIME_PREC_INV 1000000.0
99 #define JROUND(j) (rint(((double) (j))*TIME_PREC_INV)/TIME_PREC_INV)
100
101
102 /*
103  * timestamp.c prototypes
104  */
105
106 extern Timestamp *timestamp_in(char *str);
107 extern char *timestamp_out(Timestamp *dt);
108 extern bool timestamp_eq(Timestamp *dt1, Timestamp *dt2);
109 extern bool timestamp_ne(Timestamp *dt1, Timestamp *dt2);
110 extern bool timestamp_lt(Timestamp *dt1, Timestamp *dt2);
111 extern bool timestamp_le(Timestamp *dt1, Timestamp *dt2);
112 extern bool timestamp_ge(Timestamp *dt1, Timestamp *dt2);
113 extern bool timestamp_gt(Timestamp *dt1, Timestamp *dt2);
114 extern bool timestamp_finite(Timestamp *timestamp);
115 extern int      timestamp_cmp(Timestamp *dt1, Timestamp *dt2);
116 extern Timestamp *timestamp_smaller(Timestamp *dt1, Timestamp *dt2);
117 extern Timestamp *timestamp_larger(Timestamp *dt1, Timestamp *dt2);
118
119 extern Interval *interval_in(char *str);
120 extern char *interval_out(Interval *span);
121 extern bool interval_eq(Interval *span1, Interval *span2);
122 extern bool interval_ne(Interval *span1, Interval *span2);
123 extern bool interval_lt(Interval *span1, Interval *span2);
124 extern bool interval_le(Interval *span1, Interval *span2);
125 extern bool interval_ge(Interval *span1, Interval *span2);
126 extern bool interval_gt(Interval *span1, Interval *span2);
127 extern bool interval_finite(Interval *span);
128 extern int      interval_cmp(Interval *span1, Interval *span2);
129 extern Interval *interval_smaller(Interval *span1, Interval *span2);
130 extern Interval *interval_larger(Interval *span1, Interval *span2);
131
132 extern text *timestamp_text(Timestamp *timestamp);
133 extern Timestamp *text_timestamp(text *str);
134 extern text *interval_text(Interval *interval);
135 extern Interval *text_interval(text *str);
136 extern Timestamp *timestamp_trunc(text *units, Timestamp *timestamp);
137 extern Interval *interval_trunc(text *units, Interval *interval);
138 extern float64 timestamp_part(text *units, Timestamp *timestamp);
139 extern float64 interval_part(text *units, Interval *interval);
140 extern text *timestamp_zone(text *zone, Timestamp *timestamp);
141
142 extern Interval *interval_um(Interval *span);
143 extern Interval *interval_pl(Interval *span1, Interval *span2);
144 extern Interval *interval_mi(Interval *span1, Interval *span2);
145 extern Interval *interval_mul(Interval *span1, float8 *factor);
146 extern Interval *mul_d_interval(float8 *factor, Interval *span1);
147 extern Interval *interval_div(Interval *span1, float8 *factor);
148
149 extern Interval *timestamp_mi(Timestamp *dt1, Timestamp *dt2);
150 extern Timestamp *timestamp_pl_span(Timestamp *dt, Interval *span);
151 extern Timestamp *timestamp_mi_span(Timestamp *dt, Interval *span);
152 extern Interval *timestamp_age(Timestamp *dt1, Timestamp *dt2);
153 extern bool overlaps_timestamp(Timestamp *dt1, Timestamp *dt2, Timestamp *dt3, Timestamp *dt4);
154
155 extern int tm2timestamp(struct tm * tm, double fsec, int *tzp, Timestamp *dt);
156 extern int timestamp2tm(Timestamp dt, int *tzp, struct tm * tm, double *fsec, char **tzn);
157
158 extern Timestamp SetTimestamp(Timestamp timestamp);
159 extern Timestamp dt2local(Timestamp dt, int timezone);
160 extern void dt2time(Timestamp dt, int *hour, int *min, double *sec);
161 extern int EncodeSpecialTimestamp(Timestamp dt, char *str);
162 extern int interval2tm(Interval span, struct tm * tm, float8 *fsec);
163 extern int tm2interval(struct tm * tm, double fsec, Interval *span);
164 extern Timestamp *now(void);
165
166 #endif   /* TIMESTAMP_H */