⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datetime.c

📁 PostgreSQL 8.1.4的源码 适用于Linux下的开源数据库系统
💻 C
📖 第 1 页 / 共 5 页
字号:
	/* don't know daylight savings time status apriori */	tm->tm_isdst = -1;	if (tzp != NULL)		*tzp = 0;	for (i = 0; i < nf; i++)	{		switch (ftype[i])		{			case DTK_DATE:				/***				 * Integral julian day with attached time zone?				 * All other forms with JD will be separated into				 * distinct fields, so we handle just this case here.				 ***/				if (ptype == DTK_JULIAN)				{					char	   *cp;					int			val;					if (tzp == NULL)						return DTERR_BAD_FORMAT;					errno = 0;					val = strtol(field[i], &cp, 10);					if (errno == ERANGE)						return DTERR_FIELD_OVERFLOW;					j2date(val, &tm->tm_year, &tm->tm_mon, &tm->tm_mday);					/* Get the time zone from the end of the string */					dterr = DecodeTimezone(cp, tzp);					if (dterr)						return dterr;					tmask = DTK_DATE_M | DTK_TIME_M | DTK_M(TZ);					ptype = 0;					break;				}				/***				 * Already have a date? Then this might be a POSIX time				 * zone with an embedded dash (e.g. "PST-3" == "EST") or				 * a run-together time with trailing time zone (e.g. hhmmss-zz).				 * - thomas 2001-12-25				 ***/				else if ((fmask & DTK_DATE_M) == DTK_DATE_M || ptype != 0)				{					/* No time zone accepted? Then quit... */					if (tzp == NULL)						return DTERR_BAD_FORMAT;					if (isdigit((unsigned char) *field[i]) || ptype != 0)					{						char	   *cp;						if (ptype != 0)						{							/* Sanity check; should not fail this test */							if (ptype != DTK_TIME)								return DTERR_BAD_FORMAT;							ptype = 0;						}						/*						 * Starts with a digit but we already have a time						 * field? Then we are in trouble with a date and time						 * already...						 */						if ((fmask & DTK_TIME_M) == DTK_TIME_M)							return DTERR_BAD_FORMAT;						if ((cp = strchr(field[i], '-')) == NULL)							return DTERR_BAD_FORMAT;						/* Get the time zone from the end of the string */						dterr = DecodeTimezone(cp, tzp);						if (dterr)							return dterr;						*cp = '\0';						/*						 * Then read the rest of the field as a concatenated						 * time						 */						dterr = DecodeNumberField(strlen(field[i]), field[i],												  fmask,												  &tmask, tm,												  fsec, &is2digits);						if (dterr < 0)							return dterr;						ftype[i] = dterr;						/*						 * modify tmask after returning from						 * DecodeNumberField()						 */						tmask |= DTK_M(TZ);					}					else					{						dterr = DecodePosixTimezone(field[i], tzp);						if (dterr)							return dterr;						ftype[i] = DTK_TZ;						tmask = DTK_M(TZ);					}				}				else				{					dterr = DecodeDate(field[i], fmask, &tmask, tm);					if (dterr)						return dterr;				}				break;			case DTK_TIME:				dterr = DecodeTime(field[i], fmask, &tmask, tm, fsec);				if (dterr)					return dterr;				/*				 * Check upper limit on hours; other limits checked in				 * DecodeTime()				 */				/* test for > 24:00:00 */				if (tm->tm_hour > 24 ||					(tm->tm_hour == 24 && (tm->tm_min > 0 || tm->tm_sec > 0)))					return DTERR_FIELD_OVERFLOW;				break;			case DTK_TZ:				{					int			tz;					if (tzp == NULL)						return DTERR_BAD_FORMAT;					dterr = DecodeTimezone(field[i], &tz);					if (dterr)						return dterr;					/*					 * Already have a time zone? Then maybe this is the second					 * field of a POSIX time: EST+3 (equivalent to PST)					 */					if (i > 0 && (fmask & DTK_M(TZ)) != 0 &&						ftype[i - 1] == DTK_TZ &&						isalpha((unsigned char) *field[i - 1]))					{						*tzp -= tz;						tmask = 0;					}					else					{						*tzp = tz;						tmask = DTK_M(TZ);					}				}				break;			case DTK_NUMBER:				/*				 * Was this an "ISO date" with embedded field labels? An				 * example is "y2001m02d04" - thomas 2001-02-04				 */				if (ptype != 0)				{					char	   *cp;					int			val;					errno = 0;					val = strtol(field[i], &cp, 10);					if (errno == ERANGE)						return DTERR_FIELD_OVERFLOW;					/*					 * only a few kinds are allowed to have an embedded					 * decimal					 */					if (*cp == '.')						switch (ptype)						{							case DTK_JULIAN:							case DTK_TIME:							case DTK_SECOND:								break;							default:								return DTERR_BAD_FORMAT;								break;						}					else if (*cp != '\0')						return DTERR_BAD_FORMAT;					switch (ptype)					{						case DTK_YEAR:							tm->tm_year = val;							tmask = DTK_M(YEAR);							break;						case DTK_MONTH:							/*							 * already have a month and hour? then assume							 * minutes							 */							if ((fmask & DTK_M(MONTH)) != 0 &&								(fmask & DTK_M(HOUR)) != 0)							{								tm->tm_min = val;								tmask = DTK_M(MINUTE);							}							else							{								tm->tm_mon = val;								tmask = DTK_M(MONTH);							}							break;						case DTK_DAY:							tm->tm_mday = val;							tmask = DTK_M(DAY);							break;						case DTK_HOUR:							tm->tm_hour = val;							tmask = DTK_M(HOUR);							break;						case DTK_MINUTE:							tm->tm_min = val;							tmask = DTK_M(MINUTE);							break;						case DTK_SECOND:							tm->tm_sec = val;							tmask = DTK_M(SECOND);							if (*cp == '.')							{								double		frac;								frac = strtod(cp, &cp);								if (*cp != '\0')									return DTERR_BAD_FORMAT;#ifdef HAVE_INT64_TIMESTAMP								*fsec = rint(frac * 1000000);#else								*fsec = frac;#endif							}							break;						case DTK_TZ:							tmask = DTK_M(TZ);							dterr = DecodeTimezone(field[i], tzp);							if (dterr)								return dterr;							break;						case DTK_JULIAN:							/***							 * previous field was a label for "julian date"?							 ***/							tmask = DTK_DATE_M;							j2date(val, &tm->tm_year, &tm->tm_mon, &tm->tm_mday);							/* fractional Julian Day? */							if (*cp == '.')							{								double		time;								time = strtod(cp, &cp);								if (*cp != '\0')									return DTERR_BAD_FORMAT;								tmask |= DTK_TIME_M;#ifdef HAVE_INT64_TIMESTAMP								dt2time(time * USECS_PER_DAY,										&tm->tm_hour, &tm->tm_min,										&tm->tm_sec, fsec);#else								dt2time(time * SECS_PER_DAY, &tm->tm_hour,										&tm->tm_min, &tm->tm_sec, fsec);#endif							}							break;						case DTK_TIME:							/* previous field was "t" for ISO time */							dterr = DecodeNumberField(strlen(field[i]), field[i],													  (fmask | DTK_DATE_M),													  &tmask, tm,													  fsec, &is2digits);							if (dterr < 0)								return dterr;							ftype[i] = dterr;							if (tmask != DTK_TIME_M)								return DTERR_BAD_FORMAT;							break;						default:							return DTERR_BAD_FORMAT;							break;					}					ptype = 0;					*dtype = DTK_DATE;				}				else				{					char	   *cp;					int			flen;					flen = strlen(field[i]);					cp = strchr(field[i], '.');					/* Embedded decimal and no date yet? */					if (cp != NULL && !(fmask & DTK_DATE_M))					{						dterr = DecodeDate(field[i], fmask, &tmask, tm);						if (dterr)							return dterr;					}					/* embedded decimal and several digits before? */					else if (cp != NULL && flen - strlen(cp) > 2)					{						/*						 * Interpret as a concatenated date or time Set the						 * type field to allow decoding other fields later.						 * Example: 20011223 or 040506						 */						dterr = DecodeNumberField(flen, field[i], fmask,												  &tmask, tm,												  fsec, &is2digits);						if (dterr < 0)							return dterr;						ftype[i] = dterr;					}					else if (flen > 4)					{						dterr = DecodeNumberField(flen, field[i], fmask,												  &tmask, tm,												  fsec, &is2digits);						if (dterr < 0)							return dterr;						ftype[i] = dterr;					}					/* otherwise it is a single date/time field... */					else					{						dterr = DecodeNumber(flen, field[i],											 haveTextMonth, fmask,											 &tmask, tm,											 fsec, &is2digits);						if (dterr)							return dterr;					}				}				break;			case DTK_STRING:			case DTK_SPECIAL:				type = DecodeSpecial(i, field[i], &val);				if (type == IGNORE_DTF)					continue;				tmask = DTK_M(type);				switch (type)				{					case RESERV:						switch (val)						{							case DTK_CURRENT:								ereport(ERROR,									 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),									  errmsg("date/time value \"current\" is no longer supported")));								return DTERR_BAD_FORMAT;								break;							case DTK_NOW:								tmask = (DTK_DATE_M | DTK_TIME_M | DTK_M(TZ));								*dtype = DTK_DATE;								GetCurrentTimeUsec(tm, fsec, tzp);								break;							case DTK_YESTERDAY:								tmask = DTK_DATE_M;								*dtype = DTK_DATE;								GetCurrentDateTime(tm);								j2date(date2j(tm->tm_year, tm->tm_mon, tm->tm_mday) - 1,									&tm->tm_year, &tm->tm_mon, &tm->tm_mday);								tm->tm_hour = 0;								tm->tm_min = 0;								tm->tm_sec = 0;								break;							case DTK_TODAY:								tmask = DTK_DATE_M;								*dtype = DTK_DATE;								GetCurrentDateTime(tm);								tm->tm_hour = 0;								tm->tm_min = 0;								tm->tm_sec = 0;								break;							case DTK_TOMORROW:								tmask = DTK_DATE_M;								*dtype = DTK_DATE;								GetCurrentDateTime(tm);								j2date(date2j(tm->tm_year, tm->tm_mon, tm->tm_mday) + 1,									&tm->tm_year, &tm->tm_mon, &tm->tm_mday);								tm->tm_hour = 0;								tm->tm_min = 0;								tm->tm_sec = 0;								break;							case DTK_ZULU:								tmask = (DTK_TIME_M | DTK_M(TZ));								*dtype = DTK_DATE;								tm->tm_hour = 0;								tm->tm_min = 0;								tm->tm_sec = 0;								if (tzp != NULL)									*tzp = 0;								break;							default:								*dtype = val;						}						break;					case MONTH:						/*						 * already have a (numeric) month? then see if we can						 * substitute...						 */						if ((fmask & DTK_M(MONTH)) && !haveTextMonth &&							!(fmask & DTK_M(DAY)) && tm->tm_mon >= 1 &&							tm->tm_mon <= 31)						{							tm->tm_mday = tm->tm_mon;							tmask = DTK_M(DAY);						}						haveTextMonth = TRUE;						tm->tm_mon = val;						break;					case DTZMOD:						/*						 * daylight savings time modifier (solves "MET DST"						 * syntax)						 */						tmask |= DTK_M(DTZ);						tm->tm_isdst = 1;						if (tzp == NULL)							return DTERR_BAD_FORMAT;						*tzp += val * MINS_PER_HOUR;						break;					case DTZ:						/*						 * set mask for TZ here _or_ check for DTZ later when						 * getting default timezone						 */						tmask |= DTK_M(TZ);						tm->tm_isdst = 1;						if (tzp == NULL)							return DTERR_BAD_FORMAT;						*tzp = val * MINS_PER_HOUR;						ftype[i] = DTK_TZ;						break;					case TZ:						tm->tm_isdst = 0;						if (tzp == NULL)							return DTERR_BAD_FORMAT;						*tzp = val * MINS_PER_HOUR;						ftype[i] = DTK_TZ;						break;					case IGNORE_DTF:						break;					case AMPM:						mer = val;						break;					case ADBC:						bc = (val == BC);						break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -