PostgreSQL Source Code  git master
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)
127  ereport(ERROR,
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" : ""),
138  typmod = MAX_TIMESTAMP_PRECISION;
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 5160 of file timestamp.c.

5161 {
5162  float8 result;
5163  int day0,
5164  day4,
5165  dayn;
5166 
5167  /* current day */
5168  dayn = date2j(year, mon, mday);
5169 
5170  /* fourth day of current year */
5171  day4 = date2j(year, 1, 4);
5172 
5173  /* day0 == offset to first day of week (Monday) */
5174  day0 = j2day(day4 - 1);
5175 
5176  /*
5177  * We need the first week containing a Thursday, otherwise this day falls
5178  * into the previous year for purposes of counting weeks
5179  */
5180  if (dayn < day4 - day0)
5181  {
5182  day4 = date2j(year - 1, 1, 4);
5183 
5184  /* day0 == offset to first day of week (Monday) */
5185  day0 = j2day(day4 - 1);
5186  }
5187 
5188  result = (dayn - (day4 - day0)) / 7 + 1;
5189 
5190  /*
5191  * Sometimes the last few days in a year will fall into the first week of
5192  * the next year, so check for this.
5193  */
5194  if (result >= 52)
5195  {
5196  day4 = date2j(year + 1, 1, 4);
5197 
5198  /* day0 == offset to first day of week (Monday) */
5199  day0 = j2day(day4 - 1);
5200 
5201  if (dayn >= day4 - day0)
5202  result = (dayn - (day4 - day0)) / 7 + 1;
5203  }
5204 
5205  return (int) result;
5206 }
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:621

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 5215 of file timestamp.c.

5216 {
5217  float8 result;
5218  int day0,
5219  day4,
5220  dayn;
5221 
5222  /* current day */
5223  dayn = date2j(year, mon, mday);
5224 
5225  /* fourth day of current year */
5226  day4 = date2j(year, 1, 4);
5227 
5228  /* day0 == offset to first day of week (Monday) */
5229  day0 = j2day(day4 - 1);
5230 
5231  /*
5232  * We need the first week containing a Thursday, otherwise this day falls
5233  * into the previous year for purposes of counting weeks
5234  */
5235  if (dayn < day4 - day0)
5236  {
5237  day4 = date2j(year - 1, 1, 4);
5238 
5239  /* day0 == offset to first day of week (Monday) */
5240  day0 = j2day(day4 - 1);
5241 
5242  year--;
5243  }
5244 
5245  result = (dayn - (day4 - day0)) / 7 + 1;
5246 
5247  /*
5248  * Sometimes the last few days in a year will fall into the first week of
5249  * the next year, so check for this.
5250  */
5251  if (result >= 52)
5252  {
5253  day4 = date2j(year + 1, 1, 4);
5254 
5255  /* day0 == offset to first day of week (Monday) */
5256  day0 = j2day(day4 - 1);
5257 
5258  if (dayn >= day4 - day0)
5259  year++;
5260  }
5261 
5262  return year;
5263 }

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 5272 of file timestamp.c.

5273 {
5274  return date2j(year, mon, mday) - isoweek2j(date2isoyear(year, mon, mday), 1) + 1;
5275 }
int isoweek2j(int year, int week)
Definition: timestamp.c:5109
int date2isoyear(int year, int mon, int mday)
Definition: timestamp.c:5215

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_bgworker(), 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(), StartTransaction(), test_pattern(), test_random(), throttle(), update_synced_slots_inactive_since(), UpdateWorkerStats(), WaitExceedsMaxStandbyDelay(), WaitForLSNReplay(), 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
struct pg_tm * pg_gmtime(const pg_time_t *timep)
Definition: localtime.c:1389
int64 pg_time_t
Definition: pgtime.h:23
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:6382

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 5129 of file timestamp.c.

5130 {
5131  j2date(isoweek2j(*year, woy), year, mon, mday);
5132 }
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 5109 of file timestamp.c.

5110 {
5111  int day0,
5112  day4;
5113 
5114  /* fourth day of current year */
5115  day4 = date2j(year, 1, 4);
5116 
5117  /* day0 == offset to first day of week (Monday) */
5118  day0 = j2day(day4 - 1);
5119 
5120  return ((week - 1) * 7) + (day4 - day0);
5121 }

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 5142 of file timestamp.c.

5143 {
5144  int jday;
5145 
5146  jday = isoweek2j(*year, isoweek);
5147  /* convert Gregorian week start (Sunday=1) to ISO week start (Monday=1) */
5148  if (wday > 1)
5149  jday += wday - 2;
5150  else
5151  jday += 6;
5152  j2date(jday, year, mon, mday);
5153 }

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 */
2070  if (pg_add_s64_overflow(span->time, itm->tm_min * USECS_PER_MINUTE,
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 }
signed int int32
Definition: c.h:496
#define INTERVAL_NOT_FINITE(i)
Definition: timestamp.h:195
static bool pg_mul_s64_overflow(int64 a, int64 b, int64 *result)
Definition: int.h:261
static bool pg_add_s64_overflow(int64 a, int64 b, int64 *result)
Definition: int.h:203
if(TABLE==NULL||TABLE_index==NULL)
Definition: isn.c:77

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 
2177  GetEpochTime(tm);
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 6313 of file timestamp.c.

6314 {
6315  TimestampTz result;
6316  struct pg_tm tt,
6317  *tm = &tt;
6318  fsec_t fsec;
6319  int tz;
6320 
6321  if (overflow)
6322  *overflow = 0;
6323 
6325  return timestamp;
6326 
6327  /* We don't expect this to fail, but check it pro forma */
6328  if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL, NULL) == 0)
6329  {
6331 
6332  result = dt2local(timestamp, -tz);
6333 
6334  if (IS_VALID_TIMESTAMP(result))
6335  {
6336  return result;
6337  }
6338  else if (overflow)
6339  {
6340  if (result < MIN_TIMESTAMP)
6341  {
6342  *overflow = -1;
6343  TIMESTAMP_NOBEGIN(result);
6344  }
6345  else
6346  {
6347  *overflow = 1;
6348  TIMESTAMP_NOEND(result);
6349  }
6350  return result;
6351  }
6352  }
6353 
6354  ereport(ERROR,
6355  (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
6356  errmsg("timestamp out of range")));
6357 
6358  return 0;
6359 }
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 {
1893  Timestamp date;
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 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(), 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:6313
#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:230

References 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(), WaitForLSNReplay(), WaitForWalSummarization(), WaitForWALToBecomeAvailable(), WalReceiverMain(), and WalSndComputeSleeptime().

◆ TimestampGetDatum()

◆ TimestampTimestampTzRequiresRewrite()

bool TimestampTimestampTzRequiresRewrite ( void  )

Definition at line 6282 of file timestamp.c.

6283 {
6284  long offset;
6285 
6286  if (pg_get_timezone_offset(session_timezone, &offset) && offset == 0)
6287  return false;
6288  return true;
6289 }
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:73
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 {
1989  TimeOffset date;
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:314
#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().