summaryrefslogtreecommitdiff
path: root/src/include/utils/timestamp.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/include/utils/timestamp.h')
-rw-r--r--src/include/utils/timestamp.h208
1 files changed, 208 insertions, 0 deletions
diff --git a/src/include/utils/timestamp.h b/src/include/utils/timestamp.h
new file mode 100644
index 00000000000..27a5288cf39
--- /dev/null
+++ b/src/include/utils/timestamp.h
@@ -0,0 +1,208 @@
+/*-------------------------------------------------------------------------
+ *
+ * timestamp.h
+ * Definitions for the SQL92 "timestamp" and "interval" types.
+ *
+ * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * $Id: timestamp.h,v 1.1 2000/02/16 17:26:26 thomas Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef TIMESTAMP_H
+#define TIMESTAMP_H
+
+#include <time.h>
+#include <math.h>
+#include <limits.h>
+
+/*
+ * Timestamp represents absolute time.
+ * Interval represents delta time. Keep track of months (and years)
+ * separately since the elapsed time spanned is unknown until instantiated
+ * relative to an absolute time.
+ *
+ * Note that Postgres uses "time interval" to mean a bounded interval,
+ * consisting of a beginning and ending time, not a time span - thomas 97/03/20
+ */
+
+typedef double Timestamp;
+
+typedef struct
+{
+ double time; /* all time units other than months and
+ * years */
+ int4 month; /* months and years, after time for
+ * alignment */
+} Interval;
+
+
+#ifdef NAN
+#define DT_INVALID (NAN)
+#else
+#define DT_INVALID (DBL_MIN+DBL_MIN)
+#endif
+#ifdef HUGE_VAL
+#define DT_NOBEGIN (-HUGE_VAL)
+#define DT_NOEND (HUGE_VAL)
+#else
+#define DT_NOBEGIN (-DBL_MAX)
+#define DT_NOEND (DBL_MAX)
+#endif
+#define DT_CURRENT (DBL_MIN)
+#define DT_EPOCH (-DBL_MIN)
+
+#define TIMESTAMP_INVALID(j) {j = DT_INVALID;}
+#ifdef NAN
+#define TIMESTAMP_IS_INVALID(j) (isnan(j))
+#else
+#define TIMESTAMP_IS_INVALID(j) (j == DT_INVALID)
+#endif
+
+#define TIMESTAMP_NOBEGIN(j) {j = DT_NOBEGIN;}
+#define TIMESTAMP_IS_NOBEGIN(j) (j == DT_NOBEGIN)
+
+#define TIMESTAMP_NOEND(j) {j = DT_NOEND;}
+#define TIMESTAMP_IS_NOEND(j) (j == DT_NOEND)
+
+#define TIMESTAMP_CURRENT(j) {j = DT_CURRENT;}
+#if defined(linux) && defined(__powerpc__)
+extern int timestamp_is_current(double j);
+
+#define TIMESTAMP_IS_CURRENT(j) timestamp_is_current(j)
+#else
+#define TIMESTAMP_IS_CURRENT(j) (j == DT_CURRENT)
+#endif
+
+#define TIMESTAMP_EPOCH(j) {j = DT_EPOCH;}
+#if defined(linux) && defined(__powerpc__)
+extern int timestamp_is_epoch(double j);
+
+#define TIMESTAMP_IS_EPOCH(j) timestamp_is_epoch(j)
+#else
+#define TIMESTAMP_IS_EPOCH(j) (j == DT_EPOCH)
+#endif
+
+#define TIMESTAMP_IS_RELATIVE(j) (TIMESTAMP_IS_CURRENT(j) || TIMESTAMP_IS_EPOCH(j))
+#define TIMESTAMP_NOT_FINITE(j) (TIMESTAMP_IS_INVALID(j) \
+ || TIMESTAMP_IS_NOBEGIN(j) || TIMESTAMP_IS_NOEND(j))
+#define TIMESTAMP_IS_RESERVED(j) (TIMESTAMP_IS_RELATIVE(j) || TIMESTAMP_NOT_FINITE(j))
+
+#define INTERVAL_INVALID(j) {(j).time = DT_INVALID;}
+#ifdef NAN
+#define INTERVAL_IS_INVALID(j) (isnan((j).time))
+#else
+#define INTERVAL_IS_INVALID(j) ((j).time == DT_INVALID)
+#endif
+#define INTERVAL_NOT_FINITE(j) INTERVAL_IS_INVALID(j)
+
+#define TIME_PREC_INV 1000000.0
+#define JROUND(j) (rint(((double) (j))*TIME_PREC_INV)/TIME_PREC_INV)
+
+
+#if 0
+
+
+/*
+ * Date/time validation
+ * Include check for leap year.
+ */
+
+extern int day_tab[2][13];
+
+#define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
+
+/* Julian date support for date2j() and j2date()
+ * Set the minimum year to one greater than the year of the first valid day
+ * to avoid having to check year and day both. - tgl 97/05/08
+ */
+
+#define JULIAN_MINYEAR (-4713)
+#define JULIAN_MINMONTH (11)
+#define JULIAN_MINDAY (23)
+
+#define IS_VALID_JULIAN(y,m,d) ((y > JULIAN_MINYEAR) \
+ || ((y == JULIAN_MINYEAR) && ((m > JULIAN_MINMONTH) \
+ || ((m == JULIAN_MINMONTH) && (d >= JULIAN_MINDAY)))))
+
+#define UTIME_MINYEAR (1901)
+#define UTIME_MINMONTH (12)
+#define UTIME_MINDAY (14)
+#define UTIME_MAXYEAR (2038)
+#define UTIME_MAXMONTH (01)
+#define UTIME_MAXDAY (18)
+
+#define IS_VALID_UTIME(y,m,d) (((y > UTIME_MINYEAR) \
+ || ((y == UTIME_MINYEAR) && ((m > UTIME_MINMONTH) \
+ || ((m == UTIME_MINMONTH) && (d >= UTIME_MINDAY))))) \
+ && ((y < UTIME_MAXYEAR) \
+ || ((y == UTIME_MAXYEAR) && ((m < UTIME_MAXMONTH) \
+ || ((m == UTIME_MAXMONTH) && (d <= UTIME_MAXDAY))))))
+
+
+#endif
+
+
+/*
+ * timestamp.c prototypes
+ */
+
+extern Timestamp *timestamp_in(char *str);
+extern char *timestamp_out(Timestamp *dt);
+extern bool timestamp_eq(Timestamp *dt1, Timestamp *dt2);
+extern bool timestamp_ne(Timestamp *dt1, Timestamp *dt2);
+extern bool timestamp_lt(Timestamp *dt1, Timestamp *dt2);
+extern bool timestamp_le(Timestamp *dt1, Timestamp *dt2);
+extern bool timestamp_ge(Timestamp *dt1, Timestamp *dt2);
+extern bool timestamp_gt(Timestamp *dt1, Timestamp *dt2);
+extern bool timestamp_finite(Timestamp *timestamp);
+extern int timestamp_cmp(Timestamp *dt1, Timestamp *dt2);
+extern Timestamp *timestamp_smaller(Timestamp *dt1, Timestamp *dt2);
+extern Timestamp *timestamp_larger(Timestamp *dt1, Timestamp *dt2);
+
+extern Interval *interval_in(char *str);
+extern char *interval_out(Interval *span);
+extern bool interval_eq(Interval *span1, Interval *span2);
+extern bool interval_ne(Interval *span1, Interval *span2);
+extern bool interval_lt(Interval *span1, Interval *span2);
+extern bool interval_le(Interval *span1, Interval *span2);
+extern bool interval_ge(Interval *span1, Interval *span2);
+extern bool interval_gt(Interval *span1, Interval *span2);
+extern bool interval_finite(Interval *span);
+extern int interval_cmp(Interval *span1, Interval *span2);
+extern Interval *interval_smaller(Interval *span1, Interval *span2);
+extern Interval *interval_larger(Interval *span1, Interval *span2);
+
+extern text *timestamp_text(Timestamp *timestamp);
+extern Timestamp *text_timestamp(text *str);
+extern text *interval_text(Interval *interval);
+extern Interval *text_interval(text *str);
+extern Timestamp *timestamp_trunc(text *units, Timestamp *timestamp);
+extern Interval *interval_trunc(text *units, Interval *interval);
+extern float64 timestamp_part(text *units, Timestamp *timestamp);
+extern float64 interval_part(text *units, Interval *interval);
+extern text *timestamp_zone(text *zone, Timestamp *timestamp);
+
+extern Interval *interval_um(Interval *span);
+extern Interval *interval_pl(Interval *span1, Interval *span2);
+extern Interval *interval_mi(Interval *span1, Interval *span2);
+extern Interval *interval_div(Interval *span1, float8 *arg2);
+
+extern Interval *timestamp_mi(Timestamp *dt1, Timestamp *dt2);
+extern Timestamp *timestamp_pl_span(Timestamp *dt, Interval *span);
+extern Timestamp *timestamp_mi_span(Timestamp *dt, Interval *span);
+extern Interval *timestamp_age(Timestamp *dt1, Timestamp *dt2);
+
+extern int tm2timestamp(struct tm * tm, double fsec, int *tzp, Timestamp *dt);
+extern int timestamp2tm(Timestamp dt, int *tzp, struct tm * tm, double *fsec, char **tzn);
+
+extern Timestamp SetTimestamp(Timestamp timestamp);
+extern Timestamp dt2local(Timestamp dt, int timezone);
+extern void dt2time(Timestamp dt, int *hour, int *min, double *sec);
+extern int EncodeSpecialTimestamp(Timestamp dt, char *str);
+extern int interval2tm(Interval span, struct tm * tm, float8 *fsec);
+extern int tm2interval(struct tm * tm, double fsec, Interval *span);
+extern Timestamp *now(void);
+
+#endif /* TIMESTAMP_H */