timestamp.c

来自「postgresql8.3.4源码,开源数据库」· C语言 代码 · 共 1,001 行 · 第 1/2 页

C
1,001
字号
						(*pstr_len)--;					}					tm->tm_mon += 1;					replace_type = PGTYPES_TYPE_NOTHING;					break;					/*					 * Like %G, but without century, i.e., with a 2-digit year					 * (00-99).					 */				case 'g':					{						const char *fmt = "%g"; /* Keep compiler quiet about												 * 2-digit year */						tm->tm_mon -= 1;						i = strftime(q, *pstr_len, fmt, tm);						if (i == 0)							return -1;						while (*q)						{							q++;							(*pstr_len)--;						}						tm->tm_mon += 1;						replace_type = PGTYPES_TYPE_NOTHING;					}					break;					/* hour (24 hour clock) with leading zeroes */				case 'H':					replace_val.uint_val = tm->tm_hour;					replace_type = PGTYPES_TYPE_UINT_2_LZ;					break;					/* hour (12 hour clock) with leading zeroes */				case 'I':					replace_val.uint_val = tm->tm_hour % 12;					replace_type = PGTYPES_TYPE_UINT_2_LZ;					break;					/*					 * The day of the year as a decimal number with leading					 * zeroes. It ranges from 001 to 366.					 */				case 'j':					replace_val.uint_val = tm->tm_yday;					replace_type = PGTYPES_TYPE_UINT_3_LZ;					break;					/*					 * The hour (24 hour clock). Leading zeroes will be turned					 * into spaces.					 */				case 'k':					replace_val.uint_val = tm->tm_hour;					replace_type = PGTYPES_TYPE_UINT_2_LS;					break;					/*					 * The hour (12 hour clock). Leading zeroes will be turned					 * into spaces.					 */				case 'l':					replace_val.uint_val = tm->tm_hour % 12;					replace_type = PGTYPES_TYPE_UINT_2_LS;					break;					/* The month as a decimal number with a leading zero */				case 'm':					replace_val.uint_val = tm->tm_mon;					replace_type = PGTYPES_TYPE_UINT_2_LZ;					break;					/* The minute as a decimal number with a leading zero */				case 'M':					replace_val.uint_val = tm->tm_min;					replace_type = PGTYPES_TYPE_UINT_2_LZ;					break;					/* A newline character */				case 'n':					replace_val.char_val = '\n';					replace_type = PGTYPES_TYPE_CHAR;					break;					/* the AM/PM specifier (uppercase) */					/* XXX should be locale aware */				case 'p':					if (tm->tm_hour < 12)						replace_val.str_val = "AM";					else						replace_val.str_val = "PM";					replace_type = PGTYPES_TYPE_STRING_CONSTANT;					break;					/* the AM/PM specifier (lowercase) */					/* XXX should be locale aware */				case 'P':					if (tm->tm_hour < 12)						replace_val.str_val = "am";					else						replace_val.str_val = "pm";					replace_type = PGTYPES_TYPE_STRING_CONSTANT;					break;					/* the time in the format %I:%M:%S %p */					/* XXX should be locale aware */				case 'r':					i = dttofmtasc_replace(ts, dDate, dow, tm,										   q, pstr_len,										   "%I:%M:%S %p");					if (i)						return i;					break;					/* The time in 24 hour notation (%H:%M) */				case 'R':					i = dttofmtasc_replace(ts, dDate, dow, tm,										   q, pstr_len,										   "%H:%M");					if (i)						return i;					break;					/* The number of seconds since the Epoch (1970-01-01) */				case 's':#ifdef HAVE_INT64_TIMESTAMP					replace_val.int64_val = (*ts - SetEpochTimestamp()) / 1000000.0;					replace_type = PGTYPES_TYPE_INT64;#else					replace_val.double_val = *ts - SetEpochTimestamp();					replace_type = PGTYPES_TYPE_DOUBLE_NF;#endif					break;					/* seconds as a decimal number with leading zeroes */				case 'S':					replace_val.uint_val = tm->tm_sec;					replace_type = PGTYPES_TYPE_UINT_2_LZ;					break;					/* A tabulator */				case 't':					replace_val.char_val = '\t';					replace_type = PGTYPES_TYPE_CHAR;					break;					/* The time in 24 hour notation (%H:%M:%S) */				case 'T':					i = dttofmtasc_replace(ts, dDate, dow, tm,										   q, pstr_len,										   "%H:%M:%S");					if (i)						return i;					break;					/*					 * The day of the week as a decimal, Monday = 1, Sunday =					 * 7					 */				case 'u':					replace_val.uint_val = dow;					if (replace_val.uint_val == 0)						replace_val.uint_val = 7;					replace_type = PGTYPES_TYPE_UINT;					break;					/* The week number of the year as a decimal number */				case 'U':					tm->tm_mon -= 1;					i = strftime(q, *pstr_len, "%U", tm);					if (i == 0)						return -1;					while (*q)					{						q++;						(*pstr_len)--;					}					tm->tm_mon += 1;					replace_type = PGTYPES_TYPE_NOTHING;					break;					/*					 * The ISO 8601:1988 week number of the current year as a					 * decimal number.					 */				case 'V':					i = strftime(q, *pstr_len, "%V", tm);					if (i == 0)						return -1;					while (*q)					{						q++;						(*pstr_len)--;					}					replace_type = PGTYPES_TYPE_NOTHING;					break;					/*					 * The day of the week as a decimal, Sunday being 0 and					 * Monday 1.					 */				case 'w':					replace_val.uint_val = dow;					replace_type = PGTYPES_TYPE_UINT;					break;					/* The week number of the year (another definition) */				case 'W':					tm->tm_mon -= 1;					i = strftime(q, *pstr_len, "%U", tm);					if (i == 0)						return -1;					while (*q)					{						q++;						(*pstr_len)--;					}					tm->tm_mon += 1;					replace_type = PGTYPES_TYPE_NOTHING;					break;					/*					 * The preferred date representation for the current					 * locale without the time.					 */				case 'x':					{						const char *fmt = "%x"; /* Keep compiler quiet about												 * 2-digit year */						tm->tm_mon -= 1;						i = strftime(q, *pstr_len, fmt, tm);						if (i == 0)							return -1;						while (*q)						{							q++;							(*pstr_len)--;						}						tm->tm_mon += 1;						replace_type = PGTYPES_TYPE_NOTHING;					}					break;					/*					 * The preferred time representation for the current					 * locale without the date.					 */				case 'X':					tm->tm_mon -= 1;					i = strftime(q, *pstr_len, "%X", tm);					if (i == 0)						return -1;					while (*q)					{						q++;						(*pstr_len)--;					}					tm->tm_mon += 1;					replace_type = PGTYPES_TYPE_NOTHING;					break;					/* The year without the century (2 digits, leading zeroes) */				case 'y':					replace_val.uint_val = tm->tm_year % 100;					replace_type = PGTYPES_TYPE_UINT_2_LZ;					break;					/* The year with the century (4 digits) */				case 'Y':					replace_val.uint_val = tm->tm_year;					replace_type = PGTYPES_TYPE_UINT;					break;					/* The time zone offset from GMT */				case 'z':					tm->tm_mon -= 1;					i = strftime(q, *pstr_len, "%z", tm);					if (i == 0)						return -1;					while (*q)					{						q++;						(*pstr_len)--;					}					tm->tm_mon += 1;					replace_type = PGTYPES_TYPE_NOTHING;					break;					/* The name or abbreviation of the time zone */				case 'Z':					tm->tm_mon -= 1;					i = strftime(q, *pstr_len, "%Z", tm);					if (i == 0)						return -1;					while (*q)					{						q++;						(*pstr_len)--;					}					tm->tm_mon += 1;					replace_type = PGTYPES_TYPE_NOTHING;					break;					/* A % sign */				case '%':					replace_val.char_val = '%';					replace_type = PGTYPES_TYPE_CHAR;					break;				case '\0':					/* fmtstr: foo%' - The string ends with a % sign */					/*					 * this is not compliant to the specification					 */					return -1;				default:					/*					 * if we don't know the pattern, we just copy it					 */					if (*pstr_len > 1)					{						*q = '%';						q++;						(*pstr_len)--;						if (*pstr_len > 1)						{							*q = *p;							q++;							(*pstr_len)--;						}						else						{							*q = '\0';							return -1;						}						*q = '\0';					}					else						return -1;					break;			}			i = pgtypes_fmt_replace(replace_val, replace_type, &q, pstr_len);			if (i)				return i;		}		else		{			if (*pstr_len > 1)			{				*q = *p;				(*pstr_len)--;				q++;				*q = '\0';			}			else				return -1;		}		p++;	}	return 0;}intPGTYPEStimestamp_fmt_asc(timestamp * ts, char *output, int str_len, char *fmtstr){	struct tm	tm;	fsec_t		fsec;	date		dDate;	int			dow;	dDate = PGTYPESdate_from_timestamp(*ts);	dow = PGTYPESdate_dayofweek(dDate);	timestamp2tm(*ts, NULL, &tm, &fsec, NULL);	return dttofmtasc_replace(ts, dDate, dow, &tm, output, &str_len, fmtstr);}intPGTYPEStimestamp_sub(timestamp * ts1, timestamp * ts2, interval * iv){	if (TIMESTAMP_NOT_FINITE(*ts1) || TIMESTAMP_NOT_FINITE(*ts2))		return PGTYPES_TS_ERR_EINFTIME;	else		iv->time = (*ts1 - *ts2);	iv->month = 0;	return 0;}intPGTYPEStimestamp_defmt_asc(char *str, char *fmt, timestamp * d){	int			year,				month,				day;	int			hour,				minute,				second;	int			tz;	int			i;	char	   *mstr;	char	   *mfmt;	if (!fmt)		fmt = "%Y-%m-%d %H:%M:%S";	if (!fmt[0])		return 1;	mstr = pgtypes_strdup(str);	mfmt = pgtypes_strdup(fmt);	/*	 * initialize with impossible values so that we can see if the fields	 * where specified at all	 */	/* XXX ambiguity with 1 BC for year? */	year = -1;	month = -1;	day = -1;	hour = 0;	minute = -1;	second = -1;	tz = 0;	i = PGTYPEStimestamp_defmt_scan(&mstr, mfmt, d, &year, &month, &day, &hour, &minute, &second, &tz);	free(mstr);	free(mfmt);	return i;}/** add an interval to a time stamp**	*tout = tin + span**	 returns 0 if successful*	 returns -1 if it fails**/intPGTYPEStimestamp_add_interval(timestamp * tin, interval * span, timestamp * tout){	if (TIMESTAMP_NOT_FINITE(*tin))		*tout = *tin;	else	{		if (span->month != 0)		{			struct tm	tt,					   *tm = &tt;			fsec_t		fsec;			if (timestamp2tm(*tin, NULL, tm, &fsec, NULL) != 0)				return -1;			tm->tm_mon += span->month;			if (tm->tm_mon > MONTHS_PER_YEAR)			{				tm->tm_year += (tm->tm_mon - 1) / MONTHS_PER_YEAR;				tm->tm_mon = (tm->tm_mon - 1) % MONTHS_PER_YEAR + 1;			}			else if (tm->tm_mon < 1)			{				tm->tm_year += tm->tm_mon / MONTHS_PER_YEAR - 1;				tm->tm_mon = tm->tm_mon % MONTHS_PER_YEAR + MONTHS_PER_YEAR;			}			/* adjust for end of month boundary problems... */			if (tm->tm_mday > day_tab[isleap(tm->tm_year)][tm->tm_mon - 1])				tm->tm_mday = (day_tab[isleap(tm->tm_year)][tm->tm_mon - 1]);			if (tm2timestamp(tm, fsec, NULL, tin) != 0)				return -1;		}		*tin += span->time;		*tout = *tin;	}	return 0;}/** subtract an interval from a time stamp**	*tout = tin - span**	 returns 0 if successful*	 returns -1 if it fails**/intPGTYPEStimestamp_sub_interval(timestamp * tin, interval * span, timestamp * tout){	interval	tspan;	tspan.month = -span->month;	tspan.time = -span->time;	return PGTYPEStimestamp_add_interval(tin, &tspan, tout);}

⌨️ 快捷键说明

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