PostgreSQL Source Code git master
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
timestamp.h File Reference
#include "datatype/timestamp.h"
#include "fmgr.h"
#include "pgtime.h"
Include dependency graph for timestamp.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define PG_GETARG_TIMESTAMP(n)   DatumGetTimestamp(PG_GETARG_DATUM(n))
 
#define PG_GETARG_TIMESTAMPTZ(n)   DatumGetTimestampTz(PG_GETARG_DATUM(n))
 
#define PG_GETARG_INTERVAL_P(n)   DatumGetIntervalP(PG_GETARG_DATUM(n))
 
#define PG_RETURN_TIMESTAMP(x)   return TimestampGetDatum(x)
 
#define PG_RETURN_TIMESTAMPTZ(x)   return TimestampTzGetDatum(x)
 
#define PG_RETURN_INTERVAL_P(x)   return IntervalPGetDatum(x)
 
#define TIMESTAMP_MASK(b)   (1 << (b))
 
#define INTERVAL_MASK(b)   (1 << (b))
 
#define INTERVAL_FULL_RANGE   (0x7FFF)
 
#define INTERVAL_RANGE_MASK   (0x7FFF)
 
#define INTERVAL_FULL_PRECISION   (0xFFFF)
 
#define INTERVAL_PRECISION_MASK   (0xFFFF)
 
#define INTERVAL_TYPMOD(p, r)   ((((r) & INTERVAL_RANGE_MASK) << 16) | ((p) & INTERVAL_PRECISION_MASK))
 
#define INTERVAL_PRECISION(t)   ((t) & INTERVAL_PRECISION_MASK)
 
#define INTERVAL_RANGE(t)   (((t) >> 16) & INTERVAL_RANGE_MASK)
 
#define TimestampTzPlusMilliseconds(tz, ms)   ((tz) + ((ms) * (int64) 1000))
 
#define TimestampTzPlusSeconds(tz, s)   ((tz) + ((s) * (int64) 1000000))
 
#define timestamptz_cmp_internal(dt1, dt2)   timestamp_cmp_internal(dt1, dt2)
 

Functions

static Timestamp DatumGetTimestamp (Datum X)
 
static TimestampTz DatumGetTimestampTz (Datum X)
 
static IntervalDatumGetIntervalP (Datum X)
 
static Datum TimestampGetDatum (Timestamp X)
 
static Datum TimestampTzGetDatum (TimestampTz X)
 
static Datum IntervalPGetDatum (const Interval *X)
 
int32 anytimestamp_typmod_check (bool istz, int32 typmod)
 
TimestampTz GetCurrentTimestamp (void)
 
TimestampTz GetSQLCurrentTimestamp (int32 typmod)
 
Timestamp GetSQLLocalTimestamp (int32 typmod)
 
void TimestampDifference (TimestampTz start_time, TimestampTz stop_time, long *secs, int *microsecs)
 
long TimestampDifferenceMilliseconds (TimestampTz start_time, TimestampTz stop_time)
 
bool TimestampDifferenceExceeds (TimestampTz start_time, TimestampTz stop_time, int msec)
 
TimestampTz time_t_to_timestamptz (pg_time_t tm)
 
pg_time_t timestamptz_to_time_t (TimestampTz t)
 
const char * timestamptz_to_str (TimestampTz t)
 
int tm2timestamp (struct pg_tm *tm, fsec_t fsec, int *tzp, Timestamp *result)
 
int timestamp2tm (Timestamp dt, int *tzp, struct pg_tm *tm, fsec_t *fsec, const char **tzn, pg_tz *attimezone)
 
void dt2time (Timestamp jd, int *hour, int *min, int *sec, fsec_t *fsec)
 
void interval2itm (Interval span, struct pg_itm *itm)
 
int itm2interval (struct pg_itm *itm, Interval *span)
 
int itmin2interval (struct pg_itm_in *itm_in, Interval *span)
 
Timestamp SetEpochTimestamp (void)
 
void GetEpochTime (struct pg_tm *tm)
 
int timestamp_cmp_internal (Timestamp dt1, Timestamp dt2)
 
TimestampTz timestamp2timestamptz_opt_overflow (Timestamp timestamp, int *overflow)
 
int32 timestamp_cmp_timestamptz_internal (Timestamp timestampVal, TimestampTz dt2)
 
int isoweek2j (int year, int week)
 
void isoweek2date (int woy, int *year, int *mon, int *mday)
 
void isoweekdate2date (int isoweek, int wday, int *year, int *mon, int *mday)
 
int date2isoweek (int year, int mon, int mday)
 
int date2isoyear (int year, int mon, int mday)
 
int date2isoyearday (int year, int mon, int mday)
 
bool TimestampTimestampTzRequiresRewrite (void)
 

Variables

PGDLLIMPORT TimestampTz PgStartTime
 
PGDLLIMPORT TimestampTz PgReloadTime
 

Macro Definition Documentation

◆ INTERVAL_FULL_PRECISION

#define INTERVAL_FULL_PRECISION   (0xFFFF)

Definition at line 78 of file timestamp.h.

◆ INTERVAL_FULL_RANGE

#define INTERVAL_FULL_RANGE   (0x7FFF)

Definition at line 76 of file timestamp.h.

◆ INTERVAL_MASK

#define INTERVAL_MASK (   b)    (1 << (b))

Definition at line 73 of file timestamp.h.

◆ INTERVAL_PRECISION

#define INTERVAL_PRECISION (   t)    ((t) & INTERVAL_PRECISION_MASK)

Definition at line 81 of file timestamp.h.

◆ INTERVAL_PRECISION_MASK

#define INTERVAL_PRECISION_MASK   (0xFFFF)

Definition at line 79 of file timestamp.h.

◆ INTERVAL_RANGE

#define INTERVAL_RANGE (   t)    (((t) >> 16) & INTERVAL_RANGE_MASK)

Definition at line 82 of file timestamp.h.

◆ INTERVAL_RANGE_MASK

#define INTERVAL_RANGE_MASK   (0x7FFF)

Definition at line 77 of file timestamp.h.

◆ INTERVAL_TYPMOD

#define INTERVAL_TYPMOD (   p,
 
)    ((((r) & INTERVAL_RANGE_MASK) << 16) | ((p) & INTERVAL_PRECISION_MASK))

Definition at line 80 of file timestamp.h.

◆ PG_GETARG_INTERVAL_P

#define PG_GETARG_INTERVAL_P (   n)    DatumGetIntervalP(PG_GETARG_DATUM(n))

Definition at line 65 of file timestamp.h.

◆ PG_GETARG_TIMESTAMP

#define PG_GETARG_TIMESTAMP (   n)    DatumGetTimestamp(PG_GETARG_DATUM(n))

Definition at line 63 of file timestamp.h.

◆ PG_GETARG_TIMESTAMPTZ

#define PG_GETARG_TIMESTAMPTZ (   n)    DatumGetTimestampTz(PG_GETARG_DATUM(n))

Definition at line 64 of file timestamp.h.

◆ PG_RETURN_INTERVAL_P

#define PG_RETURN_INTERVAL_P (   x)    return IntervalPGetDatum(x)

Definition at line 69 of file timestamp.h.

◆ PG_RETURN_TIMESTAMP

#define PG_RETURN_TIMESTAMP (   x)    return TimestampGetDatum(x)

Definition at line 67 of file timestamp.h.

◆ PG_RETURN_TIMESTAMPTZ

#define PG_RETURN_TIMESTAMPTZ (   x)    return TimestampTzGetDatum(x)

Definition at line 68 of file timestamp.h.

◆ TIMESTAMP_MASK

#define TIMESTAMP_MASK (   b)    (1 << (b))

Definition at line 72 of file timestamp.h.

◆ timestamptz_cmp_internal

#define timestamptz_cmp_internal (   dt1,
  dt2 
)    timestamp_cmp_internal(dt1, dt2)

Definition at line 131 of file timestamp.h.

◆ TimestampTzPlusMilliseconds

#define TimestampTzPlusMilliseconds (   tz,
  ms 
)    ((tz) + ((ms) * (int64) 1000))

Definition at line 85 of file timestamp.h.

◆ TimestampTzPlusSeconds

#define TimestampTzPlusSeconds (   tz,
 
)    ((tz) + ((s) * (int64) 1000000))

Definition at line 86 of file timestamp.h.

Function Documentation

◆ anytimestamp_typmod_check()

int32 anytimestamp_typmod_check ( bool  istz,
int32  typmod 
)

Definition at line 124 of file timestamp.c.

125{
126 if (typmod < 0)
128 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
129 errmsg("TIMESTAMP(%d)%s precision must not be negative",
130 typmod, (istz ? " WITH TIME ZONE" : ""))));
131 if (typmod > MAX_TIMESTAMP_PRECISION)
132 {
134 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
135 errmsg("TIMESTAMP(%d)%s precision reduced to maximum allowed, %d",
136 typmod, (istz ? " WITH TIME ZONE" : ""),
139 }
140
141 return typmod;
142}
#define MAX_TIMESTAMP_PRECISION
Definition: timestamp.h:92
int errcode(int sqlerrcode)
Definition: elog.c:853
int errmsg(const char *fmt,...)
Definition: elog.c:1070
#define WARNING
Definition: elog.h:36
#define ERROR
Definition: elog.h:39
#define ereport(elevel,...)
Definition: elog.h:149

References ereport, errcode(), errmsg(), ERROR, MAX_TIMESTAMP_PRECISION, and WARNING.

Referenced by anytimestamp_typmodin(), executeDateTimeMethod(), and transformSQLValueFunction().

◆ date2isoweek()

int date2isoweek ( int  year,
int  mon,
int  mday 
)

Definition at line 5247 of file timestamp.c.

5248{
5249 float8 result;
5250 int day0,
5251 day4,
5252 dayn;
5253
5254 /* current day */
5255 dayn = date2j(year, mon, mday);
5256
5257 /* fourth day of current year */
5258 day4 = date2j(year, 1, 4);
5259
5260 /* day0 == offset to first day of week (Monday) */
5261 day0 = j2day(day4 - 1);
5262
5263 /*
5264 * We need the first week containing a Thursday, otherwise this day falls
5265 * into the previous year for purposes of counting weeks
5266 */
5267 if (dayn < day4 - day0)
5268 {
5269 day4 = date2j(year - 1, 1, 4);
5270
5271 /* day0 == offset to first day of week (Monday) */
5272 day0 = j2day(day4 - 1);
5273 }
5274
5275 result = (dayn - (day4 - day0)) / 7 + 1;
5276
5277 /*
5278 * Sometimes the last few days in a year will fall into the first week of
5279 * the next year, so check for this.
5280 */
5281 if (result >= 52)
5282 {
5283 day4 = date2j(year + 1, 1, 4);
5284
5285 /* day0 == offset to first day of week (Monday) */
5286 day0 = j2day(day4 - 1);
5287
5288 if (dayn >= day4 - day0)
5289 result = (dayn - (day4 - day0)) / 7 + 1;
5290 }
5291
5292 return (int) result;
5293}
int j2day(int date)
Definition: datetime.c:344
int date2j(int year, int month, int day)
Definition: datetime.c:286
double float8
Definition: c.h:584

References date2j(), and j2day().

Referenced by DCH_to_char(), extract_date(), timestamp_part_common(), timestamp_trunc(), timestamptz_part_common(), and timestamptz_trunc_internal().

◆ date2isoyear()

int date2isoyear ( int  year,
int  mon,
int  mday 
)

Definition at line 5302 of file timestamp.c.

5303{
5304 float8 result;
5305 int day0,
5306 day4,
5307 dayn;
5308
5309 /* current day */
5310 dayn = date2j(year, mon, mday);
5311
5312 /* fourth day of current year */
5313 day4 = date2j(year, 1, 4);
5314
5315 /* day0 == offset to first day of week (Monday) */
5316 day0 = j2day(day4 - 1);
5317
5318 /*
5319 * We need the first week containing a Thursday, otherwise this day falls
5320 * into the previous year for purposes of counting weeks
5321 */
5322 if (dayn < day4 - day0)
5323 {
5324 day4 = date2j(year - 1, 1, 4);
5325
5326 /* day0 == offset to first day of week (Monday) */
5327 day0 = j2day(day4 - 1);
5328
5329 year--;
5330 }
5331
5332 result = (dayn - (day4 - day0)) / 7 + 1;
5333
5334 /*
5335 * Sometimes the last few days in a year will fall into the first week of
5336 * the next year, so check for this.
5337 */
5338 if (result >= 52)
5339 {
5340 day4 = date2j(year + 1, 1, 4);
5341
5342 /* day0 == offset to first day of week (Monday) */
5343 day0 = j2day(day4 - 1);
5344
5345 if (dayn >= day4 - day0)
5346 year++;
5347 }
5348
5349 return year;
5350}

References date2j(), and j2day().

Referenced by date2isoyearday(), DCH_to_char(), extract_date(), timestamp_part_common(), and timestamptz_part_common().

◆ date2isoyearday()

int date2isoyearday ( int  year,
int  mon,
int  mday 
)

Definition at line 5359 of file timestamp.c.

5360{
5361 return date2j(year, mon, mday) - isoweek2j(date2isoyear(year, mon, mday), 1) + 1;
5362}
int isoweek2j(int year, int week)
Definition: timestamp.c:5196
int date2isoyear(int year, int mon, int mday)
Definition: timestamp.c:5302

References date2isoyear(), date2j(), and isoweek2j().

Referenced by DCH_to_char().

◆ DatumGetIntervalP()

◆ DatumGetTimestamp()

◆ DatumGetTimestampTz()

static TimestampTz DatumGetTimestampTz ( Datum  X)
inlinestatic

◆ dt2time()

void dt2time ( Timestamp  jd,
int *  hour,
int *  min,
int *  sec,
fsec_t fsec 
)

Definition at line 1864 of file timestamp.c.

1865{
1866 TimeOffset time;
1867
1868 time = jd;
1869
1870 *hour = time / USECS_PER_HOUR;
1871 time -= (*hour) * USECS_PER_HOUR;
1872 *min = time / USECS_PER_MINUTE;
1873 time -= (*min) * USECS_PER_MINUTE;
1874 *sec = time / USECS_PER_SEC;
1875 *fsec = time - (*sec * USECS_PER_SEC);
1876} /* dt2time() */
#define USECS_PER_HOUR
Definition: timestamp.h:132
#define USECS_PER_SEC
Definition: timestamp.h:134
#define USECS_PER_MINUTE
Definition: timestamp.h:133
int64 TimeOffset
Definition: timestamp.h:40

References USECS_PER_HOUR, USECS_PER_MINUTE, and USECS_PER_SEC.

Referenced by DecodeDateTime(), DecodeTimeOnly(), and timestamp2tm().

◆ GetCurrentTimestamp()

TimestampTz GetCurrentTimestamp ( void  )

Definition at line 1644 of file timestamp.c.

1645{
1646 TimestampTz result;
1647 struct timeval tp;
1648
1649 gettimeofday(&tp, NULL);
1650
1651 result = (TimestampTz) tp.tv_sec -
1653 result = (result * USECS_PER_SEC) + tp.tv_usec;
1654
1655 return result;
1656}
#define UNIX_EPOCH_JDATE
Definition: timestamp.h:234
#define SECS_PER_DAY
Definition: timestamp.h:126
#define POSTGRES_EPOCH_JDATE
Definition: timestamp.h:235
int gettimeofday(struct timeval *tp, void *tzp)

References gettimeofday(), POSTGRES_EPOCH_JDATE, SECS_PER_DAY, UNIX_EPOCH_JDATE, and USECS_PER_SEC.

Referenced by ApplyLauncherMain(), asyncQueueFillWarning(), autoprewarm_main(), BackgroundWriterMain(), bbsink_copystream_archive_contents(), bbsink_copystream_end_archive(), bbsink_copystream_new(), bbsink_throttle_begin_backup(), check_log_duration(), CheckPointGuts(), CleanupBackend(), clock_timestamp(), CreateCheckPoint(), CreateEndOfRecoveryRecord(), CreateOverwriteContrecordRecord(), CreateRestartPoint(), dblink_cancel_query(), DetermineSleepTime(), disable_timeout(), disable_timeouts(), do_analyze_rel(), do_start_worker(), enable_startup_progress_timeout(), enable_timeout_after(), enable_timeout_at(), enable_timeout_every(), enable_timeouts(), entry_alloc(), entry_reset(), get_role_password(), GetCurrentTransactionStopTimestamp(), GetReplicationApplyDelay(), handle_sig_alarm(), has_startup_progress_timeout_expired(), heap_vacuum_rel(), initialize_prng(), InitProcessGlobals(), KnownAssignedXidsCompress(), launcher_determine_sleep(), libpqsrv_cancel(), LockBufferForCleanup(), log_disconnections(), LogCheckpointEnd(), logicalrep_worker_launch(), LogicalRepApplyLoop(), maybe_start_bgworkers(), pa_send_data(), PerformWalRecovery(), pgfdw_abort_cleanup_begin(), pgfdw_cancel_query(), pgfdw_exec_cleanup_query(), pgfdw_finish_abort_cleanup(), pgfdw_get_cleanup_result(), pgss_shmem_startup(), pgstat_build_snapshot(), pgstat_report_activity(), pgstat_report_analyze(), pgstat_report_archiver(), pgstat_report_autovac(), pgstat_report_checksum_failures_in_db(), pgstat_report_stat(), pgstat_report_vacuum(), pgstat_reset(), pgstat_reset_after_failure(), pgstat_reset_counters(), pgstat_reset_of_kind(), pgstat_reset_slru(), PostgresSingleUserMain(), PostmasterMain(), PrepareTransaction(), process_syncing_tables_for_apply(), ProcessConfigFileInternal(), ProcessPendingWrites(), ProcessRepliesIfAny(), ProcessStandbyReplyMessage(), ProcessWalSndrMessage(), ProcSleep(), rebuild_database_list(), RecordTransactionAbort(), RecordTransactionAbortPrepared(), RecordTransactionCommitPrepared(), recoveryApplyDelay(), ReplicationSlotRelease(), reschedule_timeouts(), ResolveRecoveryConflictWithBufferPin(), ResolveRecoveryConflictWithLock(), ResolveRecoveryConflictWithVirtualXIDs(), RestoreSlotFromDisk(), send_feedback(), SetCurrentStatementStartTimestamp(), SetupApplyOrSyncWorker(), StartBackgroundWorker(), StartTransaction(), test_pattern(), test_random(), throttle(), update_synced_slots_inactive_since(), UpdateWorkerStats(), WaitExceedsMaxStandbyDelay(), WaitForWalSummarization(), WaitForWALToBecomeAvailable(), WalReceiverMain(), WalSndKeepalive(), WalSndLoop(), WalSndUpdateProgress(), WalSndWaitForWal(), WalSndWriteData(), XLogBackgroundFlush(), XLogFileRead(), XLogPrefetchResetStats(), XLogPrefetchShmemInit(), XLogRestorePoint(), XLogSendPhysical(), XLogWalRcvSendHSFeedback(), and XLogWalRcvSendReply().

◆ GetEpochTime()

void GetEpochTime ( struct pg_tm tm)

Definition at line 2149 of file timestamp.c.

2150{
2151 struct pg_tm *t0;
2152 pg_time_t epoch = 0;
2153
2154 t0 = pg_gmtime(&epoch);
2155
2156 if (t0 == NULL)
2157 elog(ERROR, "could not convert epoch to timestamp: %m");
2158
2159 tm->tm_year = t0->tm_year;
2160 tm->tm_mon = t0->tm_mon;
2161 tm->tm_mday = t0->tm_mday;
2162 tm->tm_hour = t0->tm_hour;
2163 tm->tm_min = t0->tm_min;
2164 tm->tm_sec = t0->tm_sec;
2165
2166 tm->tm_year += 1900;
2167 tm->tm_mon++;
2168}
#define elog(elevel,...)
Definition: elog.h:225
static struct pg_tm tm
Definition: localtime.c:104
int64 pg_time_t
Definition: pgtime.h:23
struct pg_tm * pg_gmtime(const pg_time_t *timep)
Definition: localtime.c:1389
Definition: pgtime.h:35
int tm_hour
Definition: pgtime.h:38
int tm_mday
Definition: pgtime.h:39
int tm_mon
Definition: pgtime.h:40
int tm_min
Definition: pgtime.h:37
int tm_sec
Definition: pgtime.h:36
int tm_year
Definition: pgtime.h:41
static const unsigned __int64 epoch

References elog, epoch, ERROR, pg_gmtime(), tm, pg_tm::tm_hour, pg_tm::tm_mday, pg_tm::tm_min, pg_tm::tm_mon, pg_tm::tm_sec, and pg_tm::tm_year.

Referenced by date_in(), PGTYPESdate_from_asc(), and SetEpochTimestamp().

◆ GetSQLCurrentTimestamp()

TimestampTz GetSQLCurrentTimestamp ( int32  typmod)

Definition at line 1662 of file timestamp.c.

1663{
1664 TimestampTz ts;
1665
1667 if (typmod >= 0)
1668 AdjustTimestampForTypmod(&ts, typmod, NULL);
1669 return ts;
1670}
bool AdjustTimestampForTypmod(Timestamp *time, int32 typmod, Node *escontext)
Definition: timestamp.c:367
TimestampTz GetCurrentTransactionStartTimestamp(void)
Definition: xact.c:869

References AdjustTimestampForTypmod(), and GetCurrentTransactionStartTimestamp().

Referenced by ExecEvalSQLValueFunction().

◆ GetSQLLocalTimestamp()

Timestamp GetSQLLocalTimestamp ( int32  typmod)

Definition at line 1676 of file timestamp.c.

1677{
1678 Timestamp ts;
1679
1681 if (typmod >= 0)
1682 AdjustTimestampForTypmod(&ts, typmod, NULL);
1683 return ts;
1684}
static Timestamp timestamptz2timestamp(TimestampTz timestamp)
Definition: timestamp.c:6469

References AdjustTimestampForTypmod(), GetCurrentTransactionStartTimestamp(), and timestamptz2timestamp().

Referenced by ExecEvalSQLValueFunction().

◆ interval2itm()

void interval2itm ( Interval  span,
struct pg_itm itm 
)

Definition at line 2028 of file timestamp.c.

2029{
2030 TimeOffset time;
2031 TimeOffset tfrac;
2032
2033 itm->tm_year = span.month / MONTHS_PER_YEAR;
2034 itm->tm_mon = span.month % MONTHS_PER_YEAR;
2035 itm->tm_mday = span.day;
2036 time = span.time;
2037
2038 tfrac = time / USECS_PER_HOUR;
2039 time -= tfrac * USECS_PER_HOUR;
2040 itm->tm_hour = tfrac;
2041 tfrac = time / USECS_PER_MINUTE;
2042 time -= tfrac * USECS_PER_MINUTE;
2043 itm->tm_min = (int) tfrac;
2044 tfrac = time / USECS_PER_SEC;
2045 time -= tfrac * USECS_PER_SEC;
2046 itm->tm_sec = (int) tfrac;
2047 itm->tm_usec = (int) time;
2048}
#define MONTHS_PER_YEAR
Definition: timestamp.h:108
int32 day
Definition: timestamp.h:51
int32 month
Definition: timestamp.h:52
TimeOffset time
Definition: timestamp.h:49
int64 tm_hour
Definition: timestamp.h:70
int tm_year
Definition: timestamp.h:73
int tm_mon
Definition: timestamp.h:72
int tm_mday
Definition: timestamp.h:71
int tm_sec
Definition: timestamp.h:68
int tm_min
Definition: timestamp.h:69
int tm_usec
Definition: timestamp.h:67

References Interval::day, Interval::month, MONTHS_PER_YEAR, Interval::time, pg_itm::tm_hour, pg_itm::tm_mday, pg_itm::tm_min, pg_itm::tm_mon, pg_itm::tm_sec, pg_itm::tm_usec, pg_itm::tm_year, USECS_PER_HOUR, USECS_PER_MINUTE, and USECS_PER_SEC.

Referenced by interval_out(), interval_part_common(), interval_to_char(), and interval_trunc().

◆ IntervalPGetDatum()

◆ isoweek2date()

void isoweek2date ( int  woy,
int *  year,
int *  mon,
int *  mday 
)

Definition at line 5216 of file timestamp.c.

5217{
5218 j2date(isoweek2j(*year, woy), year, mon, mday);
5219}
void j2date(int jd, int *year, int *month, int *day)
Definition: datetime.c:311

References isoweek2j(), and j2date().

Referenced by do_to_timestamp(), timestamp_trunc(), and timestamptz_trunc_internal().

◆ isoweek2j()

int isoweek2j ( int  year,
int  week 
)

Definition at line 5196 of file timestamp.c.

5197{
5198 int day0,
5199 day4;
5200
5201 /* fourth day of current year */
5202 day4 = date2j(year, 1, 4);
5203
5204 /* day0 == offset to first day of week (Monday) */
5205 day0 = j2day(day4 - 1);
5206
5207 return ((week - 1) * 7) + (day4 - day0);
5208}

References date2j(), and j2day().

Referenced by date2isoyearday(), do_to_timestamp(), isoweek2date(), and isoweekdate2date().

◆ isoweekdate2date()

void isoweekdate2date ( int  isoweek,
int  wday,
int *  year,
int *  mon,
int *  mday 
)

Definition at line 5229 of file timestamp.c.

5230{
5231 int jday;
5232
5233 jday = isoweek2j(*year, isoweek);
5234 /* convert Gregorian week start (Sunday=1) to ISO week start (Monday=1) */
5235 if (wday > 1)
5236 jday += wday - 2;
5237 else
5238 jday += 6;
5239 j2date(jday, year, mon, mday);
5240}

References isoweek2j(), and j2date().

Referenced by do_to_timestamp().

◆ itm2interval()

int itm2interval ( struct pg_itm itm,
Interval span 
)

Definition at line 2058 of file timestamp.c.

2059{
2060 int64 total_months = (int64) itm->tm_year * MONTHS_PER_YEAR + itm->tm_mon;
2061
2062 if (total_months > INT_MAX || total_months < INT_MIN)
2063 return -1;
2064 span->month = (int32) total_months;
2065 span->day = itm->tm_mday;
2067 &span->time))
2068 return -1;
2069 /* tm_min, tm_sec are 32 bits, so intermediate products can't overflow */
2071 &span->time))
2072 return -1;
2073 if (pg_add_s64_overflow(span->time, itm->tm_sec * USECS_PER_SEC,
2074 &span->time))
2075 return -1;
2076 if (pg_add_s64_overflow(span->time, itm->tm_usec,
2077 &span->time))
2078 return -1;
2079 if (INTERVAL_NOT_FINITE(span))
2080 return -1;
2081 return 0;
2082}
int64_t int64
Definition: c.h:482
int32_t int32
Definition: c.h:481
#define INTERVAL_NOT_FINITE(i)
Definition: timestamp.h:195
static bool pg_mul_s64_overflow(int64 a, int64 b, int64 *result)
Definition: int.h:293
static bool pg_add_s64_overflow(int64 a, int64 b, int64 *result)
Definition: int.h:235
if(TABLE==NULL||TABLE_index==NULL)
Definition: isn.c:76

References Interval::day, if(), INTERVAL_NOT_FINITE, Interval::month, MONTHS_PER_YEAR, pg_add_s64_overflow(), pg_mul_s64_overflow(), Interval::time, pg_itm::tm_hour, pg_itm::tm_mday, pg_itm::tm_min, pg_itm::tm_mon, pg_itm::tm_sec, pg_itm::tm_usec, pg_itm::tm_year, USECS_PER_HOUR, USECS_PER_MINUTE, and USECS_PER_SEC.

Referenced by interval_trunc(), timestamp_age(), and timestamptz_age().

◆ itmin2interval()

int itmin2interval ( struct pg_itm_in itm_in,
Interval span 
)

Definition at line 2096 of file timestamp.c.

2097{
2098 int64 total_months = (int64) itm_in->tm_year * MONTHS_PER_YEAR + itm_in->tm_mon;
2099
2100 if (total_months > INT_MAX || total_months < INT_MIN)
2101 return -1;
2102 span->month = (int32) total_months;
2103 span->day = itm_in->tm_mday;
2104 span->time = itm_in->tm_usec;
2105 return 0;
2106}
int tm_mon
Definition: timestamp.h:86
int tm_year
Definition: timestamp.h:87
int tm_mday
Definition: timestamp.h:85
int64 tm_usec
Definition: timestamp.h:84

References Interval::day, if(), Interval::month, MONTHS_PER_YEAR, Interval::time, pg_itm_in::tm_mday, pg_itm_in::tm_mon, pg_itm_in::tm_usec, and pg_itm_in::tm_year.

Referenced by interval_in(), and pg_timezone_abbrevs().

◆ SetEpochTimestamp()

Timestamp SetEpochTimestamp ( void  )

Definition at line 2171 of file timestamp.c.

2172{
2173 Timestamp dt;
2174 struct pg_tm tt,
2175 *tm = &tt;
2176
2178 /* we don't bother to test for failure ... */
2179 tm2timestamp(tm, 0, NULL, &dt);
2180
2181 return dt;
2182} /* SetEpochTimestamp() */
void GetEpochTime(struct pg_tm *tm)
Definition: timestamp.c:2149
int tm2timestamp(struct pg_tm *tm, fsec_t fsec, int *tzp, Timestamp *result)
Definition: timestamp.c:1987

References GetEpochTime(), tm, and tm2timestamp().

Referenced by dttofmtasc_replace(), PGTYPEStimestamp_from_asc(), timestamp_in(), timestamp_part_common(), timestamptz_in(), and timestamptz_part_common().

◆ time_t_to_timestamptz()

TimestampTz time_t_to_timestamptz ( pg_time_t  tm)

Definition at line 1801 of file timestamp.c.

1802{
1803 TimestampTz result;
1804
1805 result = (TimestampTz) tm -
1807 result *= USECS_PER_SEC;
1808
1809 return result;
1810}

References POSTGRES_EPOCH_JDATE, SECS_PER_DAY, tm, UNIX_EPOCH_JDATE, and USECS_PER_SEC.

Referenced by pg_control_checkpoint(), pg_control_system(), pg_ls_dir_files(), and pg_stat_file().

◆ timestamp2timestamptz_opt_overflow()

TimestampTz timestamp2timestamptz_opt_overflow ( Timestamp  timestamp,
int *  overflow 
)

Definition at line 6400 of file timestamp.c.

6401{
6402 TimestampTz result;
6403 struct pg_tm tt,
6404 *tm = &tt;
6405 fsec_t fsec;
6406 int tz;
6407
6408 if (overflow)
6409 *overflow = 0;
6410
6412 return timestamp;
6413
6414 /* We don't expect this to fail, but check it pro forma */
6415 if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL, NULL) == 0)
6416 {
6418
6419 result = dt2local(timestamp, -tz);
6420
6421 if (IS_VALID_TIMESTAMP(result))
6422 {
6423 return result;
6424 }
6425 else if (overflow)
6426 {
6427 if (result < MIN_TIMESTAMP)
6428 {
6429 *overflow = -1;
6430 TIMESTAMP_NOBEGIN(result);
6431 }
6432 else
6433 {
6434 *overflow = 1;
6435 TIMESTAMP_NOEND(result);
6436 }
6437 return result;
6438 }
6439 }
6440
6441 ereport(ERROR,
6442 (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
6443 errmsg("timestamp out of range")));
6444
6445 return 0;
6446}
int DetermineTimeZoneOffset(struct pg_tm *tm, pg_tz *tzp)
Definition: datetime.c:1585
static Timestamp dt2local(Timestamp dt, int timezone)
Definition: timestamp.c:2115
int timestamp2tm(Timestamp dt, int *tzp, struct pg_tm *tm, fsec_t *fsec, const char **tzn, pg_tz *attimezone)
Definition: timestamp.c:1891
int32 fsec_t
Definition: timestamp.h:41
#define TIMESTAMP_NOBEGIN(j)
Definition: timestamp.h:159
#define IS_VALID_TIMESTAMP(t)
Definition: timestamp.h:267
#define TIMESTAMP_NOT_FINITE(j)
Definition: timestamp.h:169
#define TIMESTAMP_NOEND(j)
Definition: timestamp.h:164
#define MIN_TIMESTAMP
Definition: timestamp.h:256
PGDLLIMPORT pg_tz * session_timezone
Definition: pgtz.c:28
int64 timestamp

References DetermineTimeZoneOffset(), dt2local(), ereport, errcode(), errmsg(), ERROR, IS_VALID_TIMESTAMP, MIN_TIMESTAMP, session_timezone, timestamp2tm(), TIMESTAMP_NOBEGIN, TIMESTAMP_NOEND, TIMESTAMP_NOT_FINITE, and tm.

Referenced by timestamp2timestamptz(), and timestamp_cmp_timestamptz_internal().

◆ timestamp2tm()

int timestamp2tm ( Timestamp  dt,
int *  tzp,
struct pg_tm tm,
fsec_t fsec,
const char **  tzn,
pg_tz attimezone 
)

Definition at line 1891 of file timestamp.c.

1892{
1894 Timestamp time;
1895 pg_time_t utime;
1896
1897 /* Use session timezone if caller asks for default */
1898 if (attimezone == NULL)
1899 attimezone = session_timezone;
1900
1901 time = dt;
1902 TMODULO(time, date, USECS_PER_DAY);
1903
1904 if (time < INT64CONST(0))
1905 {
1906 time += USECS_PER_DAY;
1907 date -= 1;
1908 }
1909
1910 /* add offset to go from J2000 back to standard Julian date */
1912
1913 /* Julian day routine does not work for negative Julian days */
1914 if (date < 0 || date > (Timestamp) INT_MAX)
1915 return -1;
1916
1917 j2date((int) date, &tm->tm_year, &tm->tm_mon, &tm->tm_mday);
1918 dt2time(time, &tm->tm_hour, &tm->tm_min, &tm->tm_sec, fsec);
1919
1920 /* Done if no TZ conversion wanted */
1921 if (tzp == NULL)
1922 {
1923 tm->tm_isdst = -1;
1924 tm->tm_gmtoff = 0;
1925 tm->tm_zone = NULL;
1926 if (tzn != NULL)
1927 *tzn = NULL;
1928 return 0;
1929 }
1930
1931 /*
1932 * If the time falls within the range of pg_time_t, use pg_localtime() to
1933 * rotate to the local time zone.
1934 *
1935 * First, convert to an integral timestamp, avoiding possibly
1936 * platform-specific roundoff-in-wrong-direction errors, and adjust to
1937 * Unix epoch. Then see if we can convert to pg_time_t without loss. This
1938 * coding avoids hardwiring any assumptions about the width of pg_time_t,
1939 * so it should behave sanely on machines without int64.
1940 */
1941 dt = (dt - *fsec) / USECS_PER_SEC +
1943 utime = (pg_time_t) dt;
1944 if ((Timestamp) utime == dt)
1945 {
1946 struct pg_tm *tx = pg_localtime(&utime, attimezone);
1947
1948 tm->tm_year = tx->tm_year + 1900;
1949 tm->tm_mon = tx->tm_mon + 1;
1950 tm->tm_mday = tx->tm_mday;
1951 tm->tm_hour = tx->tm_hour;
1952 tm->tm_min = tx->tm_min;
1953 tm->tm_sec = tx->tm_sec;
1954 tm->tm_isdst = tx->tm_isdst;
1955 tm->tm_gmtoff = tx->tm_gmtoff;
1956 tm->tm_zone = tx->tm_zone;
1957 *tzp = -tm->tm_gmtoff;
1958 if (tzn != NULL)
1959 *tzn = tm->tm_zone;
1960 }
1961 else
1962 {
1963 /*
1964 * When out of range of pg_time_t, treat as GMT
1965 */
1966 *tzp = 0;
1967 /* Mark this as *no* time zone available */
1968 tm->tm_isdst = -1;
1969 tm->tm_gmtoff = 0;
1970 tm->tm_zone = NULL;
1971 if (tzn != NULL)
1972 *tzn = NULL;
1973 }
1974
1975 return 0;
1976}
void dt2time(Timestamp jd, int *hour, int *min, int *sec, fsec_t *fsec)
Definition: timestamp.c:1864
#define INT64CONST(x)
Definition: c.h:499
#define USECS_PER_DAY
Definition: timestamp.h:131
#define TMODULO(t, q, u)
Definition: datetime.h:248
struct pg_tm * pg_localtime(const pg_time_t *timep, const pg_tz *tz)
Definition: localtime.c:1344
long date
Definition: pgtypes_date.h:9
const char * tm_zone
Definition: pgtime.h:46
int tm_isdst
Definition: pgtime.h:44
long int tm_gmtoff
Definition: pgtime.h:45

References dt2time(), INT64CONST, j2date(), pg_localtime(), POSTGRES_EPOCH_JDATE, SECS_PER_DAY, session_timezone, tm, pg_tm::tm_gmtoff, pg_tm::tm_hour, pg_tm::tm_isdst, pg_tm::tm_mday, pg_tm::tm_min, pg_tm::tm_mon, pg_tm::tm_sec, pg_tm::tm_year, pg_tm::tm_zone, TMODULO, UNIX_EPOCH_JDATE, USECS_PER_DAY, and USECS_PER_SEC.

Referenced by DetermineTimeZoneAbbrevOffsetTS(), executeDateTimeMethod(), GetCurrentTimeUsec(), JsonEncodeDateTime(), make_timestamptz_at_timezone(), map_sql_value_to_xml_value(), PGTYPEStimestamp_add_interval(), PGTYPEStimestamp_fmt_asc(), PGTYPEStimestamp_to_asc(), timestamp2timestamptz_opt_overflow(), timestamp_age(), timestamp_date(), timestamp_out(), timestamp_part_common(), timestamp_pl_interval(), timestamp_recv(), timestamp_time(), timestamp_to_char(), timestamp_trunc(), timestamp_zone(), timestamptz2timestamp(), timestamptz_age(), timestamptz_date(), timestamptz_out(), timestamptz_part_common(), timestamptz_pl_interval_internal(), timestamptz_recv(), timestamptz_time(), timestamptz_timetz(), timestamptz_to_char(), timestamptz_to_str(), timestamptz_trunc_internal(), timestamptz_zone(), and timetz_zone().

◆ timestamp_cmp_internal()

int timestamp_cmp_internal ( Timestamp  dt1,
Timestamp  dt2 
)

◆ timestamp_cmp_timestamptz_internal()

int32 timestamp_cmp_timestamptz_internal ( Timestamp  timestampVal,
TimestampTz  dt2 
)

Definition at line 2318 of file timestamp.c.

2319{
2320 TimestampTz dt1;
2321 int overflow;
2322
2323 dt1 = timestamp2timestamptz_opt_overflow(timestampVal, &overflow);
2324 if (overflow > 0)
2325 {
2326 /* dt1 is larger than any finite timestamp, but less than infinity */
2327 return TIMESTAMP_IS_NOEND(dt2) ? -1 : +1;
2328 }
2329 if (overflow < 0)
2330 {
2331 /* dt1 is less than any finite timestamp, but more than -infinity */
2332 return TIMESTAMP_IS_NOBEGIN(dt2) ? +1 : -1;
2333 }
2334
2335 return timestamptz_cmp_internal(dt1, dt2);
2336}
TimestampTz timestamp2timestamptz_opt_overflow(Timestamp timestamp, int *overflow)
Definition: timestamp.c:6400
#define TIMESTAMP_IS_NOEND(j)
Definition: timestamp.h:167
#define TIMESTAMP_IS_NOBEGIN(j)
Definition: timestamp.h:162
#define timestamptz_cmp_internal(dt1, dt2)
Definition: timestamp.h:131

References timestamp2timestamptz_opt_overflow(), TIMESTAMP_IS_NOBEGIN, TIMESTAMP_IS_NOEND, and timestamptz_cmp_internal.

Referenced by cmpTimestampToTimestampTz(), timestamp_cmp_timestamptz(), timestamp_eq_timestamptz(), timestamp_ge_timestamptz(), timestamp_gt_timestamptz(), timestamp_le_timestamptz(), timestamp_lt_timestamptz(), timestamp_ne_timestamptz(), timestamptz_cmp_timestamp(), timestamptz_eq_timestamp(), timestamptz_ge_timestamp(), timestamptz_gt_timestamp(), timestamptz_le_timestamp(), timestamptz_lt_timestamp(), and timestamptz_ne_timestamp().

◆ TimestampDifference()

void TimestampDifference ( TimestampTz  start_time,
TimestampTz  stop_time,
long *  secs,
int *  microsecs 
)

Definition at line 1720 of file timestamp.c.

1722{
1723 TimestampTz diff = stop_time - start_time;
1724
1725 if (diff <= 0)
1726 {
1727 *secs = 0;
1728 *microsecs = 0;
1729 }
1730 else
1731 {
1732 *secs = (long) (diff / USECS_PER_SEC);
1733 *microsecs = (int) (diff % USECS_PER_SEC);
1734 }
1735}
static time_t start_time
Definition: pg_ctl.c:95

References start_time, and USECS_PER_SEC.

Referenced by check_log_duration(), has_startup_progress_timeout_expired(), heap_vacuum_rel(), launcher_determine_sleep(), log_disconnections(), LogRecoveryConflict(), pgstat_report_activity(), pgstat_update_dbstats(), ProcSleep(), and schedule_alarm().

◆ TimestampDifferenceExceeds()

◆ TimestampDifferenceMilliseconds()

long TimestampDifferenceMilliseconds ( TimestampTz  start_time,
TimestampTz  stop_time 
)

Definition at line 1756 of file timestamp.c.

1757{
1758 TimestampTz diff;
1759
1760 /* Deal with zero or negative elapsed time quickly. */
1761 if (start_time >= stop_time)
1762 return 0;
1763 /* To not fail with timestamp infinities, we must detect overflow. */
1764 if (pg_sub_s64_overflow(stop_time, start_time, &diff))
1765 return (long) INT_MAX;
1766 if (diff >= (INT_MAX * INT64CONST(1000) - 999))
1767 return (long) INT_MAX;
1768 else
1769 return (long) ((diff + 999) / 1000);
1770}
static bool pg_sub_s64_overflow(int64 a, int64 b, int64 *result)
Definition: int.h:262

References INT64CONST, pg_sub_s64_overflow(), and start_time.

Referenced by ApplyLauncherMain(), autoprewarm_main(), bbsink_copystream_archive_contents(), DetermineSleepTime(), do_analyze_rel(), GetReplicationApplyDelay(), GetReplicationTransferLatency(), libpqsrv_cancel(), LogCheckpointEnd(), pgfdw_get_cleanup_result(), recoveryApplyDelay(), WaitForWalSummarization(), WaitForWALToBecomeAvailable(), WalReceiverMain(), and WalSndComputeSleeptime().

◆ TimestampGetDatum()

◆ TimestampTimestampTzRequiresRewrite()

bool TimestampTimestampTzRequiresRewrite ( void  )

Definition at line 6369 of file timestamp.c.

6370{
6371 long offset;
6372
6373 if (pg_get_timezone_offset(session_timezone, &offset) && offset == 0)
6374 return false;
6375 return true;
6376}
bool pg_get_timezone_offset(const pg_tz *tz, long int *gmtoff)
Definition: localtime.c:1851

References pg_get_timezone_offset(), and session_timezone.

Referenced by ATColumnChangeRequiresRewrite().

◆ timestamptz_to_str()

const char * timestamptz_to_str ( TimestampTz  t)

Definition at line 1843 of file timestamp.c.

1844{
1845 static char buf[MAXDATELEN + 1];
1846 int tz;
1847 struct pg_tm tt,
1848 *tm = &tt;
1849 fsec_t fsec;
1850 const char *tzn;
1851
1852 if (TIMESTAMP_NOT_FINITE(t))
1854 else if (timestamp2tm(t, &tz, tm, &fsec, &tzn, NULL) == 0)
1855 EncodeDateTime(tm, fsec, true, tz, tzn, USE_ISO_DATES, buf);
1856 else
1857 strlcpy(buf, "(timestamp out of range)", sizeof(buf));
1858
1859 return buf;
1860}
void EncodeDateTime(struct pg_tm *tm, fsec_t fsec, bool print_tz, int tz, const char *tzn, int style, char *str)
Definition: datetime.c:4342
void EncodeSpecialTimestamp(Timestamp dt, char *str)
Definition: timestamp.c:1586
#define MAXDATELEN
Definition: datetime.h:200
#define USE_ISO_DATES
Definition: miscadmin.h:236
static char * buf
Definition: pg_test_fsync.c:72
size_t strlcpy(char *dst, const char *src, size_t siz)
Definition: strlcpy.c:45

References buf, EncodeDateTime(), EncodeSpecialTimestamp(), MAXDATELEN, snprintf, strlcpy(), timestamp2tm(), TIMESTAMP_NOT_FINITE, timestamptz_to_time_t(), tm, USE_ISO_DATES, and USECS_PER_SEC.

Referenced by CreateRestartPoint(), errdetail_apply_conflict(), getRecoveryStopReason(), InitWalRecovery(), PerformWalRecovery(), pg_decode_commit_prepared_txn(), pg_decode_commit_txn(), pg_decode_prepare_txn(), pg_decode_rollback_prepared_txn(), pg_decode_stream_commit(), pg_decode_stream_prepare(), ProcessStandbyHSFeedbackMessage(), ProcessStandbyReplyMessage(), ProcessWalSndrMessage(), recoveryStopsAfter(), recoveryStopsBefore(), xact_desc_abort(), xact_desc_commit(), xact_desc_prepare(), xlog_desc(), and xlogrecovery_redo().

◆ timestamptz_to_time_t()

pg_time_t timestamptz_to_time_t ( TimestampTz  t)

Definition at line 1823 of file timestamp.c.

1824{
1825 pg_time_t result;
1826
1827 result = (pg_time_t) (t / USECS_PER_SEC +
1829
1830 return result;
1831}

References POSTGRES_EPOCH_JDATE, SECS_PER_DAY, UNIX_EPOCH_JDATE, and USECS_PER_SEC.

Referenced by DetermineTimeZoneAbbrevOffsetTS(), InitProcessGlobals(), and timestamptz_to_str().

◆ TimestampTzGetDatum()

◆ tm2timestamp()

int tm2timestamp ( struct pg_tm tm,
fsec_t  fsec,
int *  tzp,
Timestamp result 
)

Definition at line 1987 of file timestamp.c.

1988{
1990 TimeOffset time;
1991
1992 /* Prevent overflow in Julian-day routines */
1994 {
1995 *result = 0; /* keep compiler quiet */
1996 return -1;
1997 }
1998
2000 time = time2t(tm->tm_hour, tm->tm_min, tm->tm_sec, fsec);
2001
2003 pg_add_s64_overflow(*result, time, result)))
2004 {
2005 *result = 0; /* keep compiler quiet */
2006 return -1;
2007 }
2008 if (tzp != NULL)
2009 *result = dt2local(*result, -(*tzp));
2010
2011 /* final range check catches just-out-of-range timestamps */
2012 if (!IS_VALID_TIMESTAMP(*result))
2013 {
2014 *result = 0; /* keep compiler quiet */
2015 return -1;
2016 }
2017
2018 return 0;
2019}
static TimeOffset time2t(const int hour, const int min, const int sec, const fsec_t fsec)
Definition: timestamp.c:2109
#define unlikely(x)
Definition: c.h:330
#define IS_VALID_JULIAN(y, m, d)
Definition: timestamp.h:227

References date2j(), dt2local(), IS_VALID_JULIAN, IS_VALID_TIMESTAMP, pg_add_s64_overflow(), pg_mul_s64_overflow(), POSTGRES_EPOCH_JDATE, time2t(), tm, pg_tm::tm_hour, pg_tm::tm_mday, pg_tm::tm_min, pg_tm::tm_mon, pg_tm::tm_sec, pg_tm::tm_year, unlikely, and USECS_PER_DAY.

Referenced by check_recovery_target_time(), parse_datetime(), PGTYPEStimestamp_add_interval(), PGTYPEStimestamp_current(), PGTYPEStimestamp_defmt_scan(), PGTYPEStimestamp_from_asc(), SetEpochTimestamp(), timestamp_in(), timestamp_pl_interval(), timestamp_trunc(), timestamp_zone(), timestamptz2timestamp(), timestamptz_in(), timestamptz_pl_interval_internal(), timestamptz_trunc_internal(), timestamptz_zone(), and to_timestamp().

Variable Documentation

◆ PgReloadTime

PGDLLIMPORT TimestampTz PgReloadTime
extern

Definition at line 56 of file timestamp.c.

Referenced by pg_conf_load_time(), and ProcessConfigFileInternal().

◆ PgStartTime

PGDLLIMPORT TimestampTz PgStartTime
extern

Definition at line 53 of file timestamp.c.

Referenced by pg_postmaster_start_time(), PostgresSingleUserMain(), and PostmasterMain().