dt.h
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:11k
源码类别:

数据库系统

开发平台:

Unix_Linux

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