TIMESTAMP and TIMESTAMPTZ store a date and time pair in UTC.
Variants
TIMESTAMP has two variants:
TIMESTAMPpresents allTIMESTAMPvalues in UTC.TIMESTAMPTZconvertsTIMESTAMPvalues from UTC to the client’s session time zone (unless another time zone is specified for the value). However, it is conceptually important to note thatTIMESTAMPTZdoes not store any time zone data.
The default session time zone is UTC, which means that by default
TIMESTAMPTZ values display in UTC.TIMESTAMPTZ uses the client’s session , while the other simply does not. This behavior extends to functions like now() and extract() on TIMESTAMPTZ values.
A time zone offset of
+00:00 is displayed for all and TIMESTAMP values, but is not stored in the database.TIMESTAMPTZ into a TIMESTAMP at a specified timezone, or to convert a TIMESTAMP into a TIMESTAMPTZ at a specified timezone.
Explore the differences of TIMESTAMP and TIMESTAMPTZ in the following video:
Best practices
We recommend always using theTIMESTAMPTZ variant because the TIMESTAMP variant can sometimes lead to unexpected behaviors when it ignores a session offset. However, we also recommend you avoid for your database.
Aliases
In CockroachDB, the following are aliases:TIMESTAMP,TIMESTAMP WITHOUT TIME ZONETIMESTAMPTZ,TIMESTAMP WITH TIME ZONE
Syntax
You can express a constant value of typeTIMESTAMP/TIMESTAMPTZ using an , or a string literal type TIMESTAMP/TIMESTAMPTZ or type TIMESTAMP/TIMESTAMPTZ. When it is unambiguous, a simple unannotated is automatically interpreted as type TIMESTAMP or TIMESTAMPTZ.
You can express TIMESTAMP constants using the following string literal formats:
| Format | Example |
|---|---|
| Date only | TIMESTAMP '2016-01-25' |
| Date and Time | TIMESTAMP '2016-01-25 10:10:10.555555' |
| ISO 8601 | TIMESTAMP '2016-01-25T10:10:10.555555' |
TIMESTAMPTZ value with time zone offset from UTC, use the following format: TIMESTAMPTZ '2016-01-25 10:10:10.555555-05:00'. The fractional portion is optional and is rounded to microseconds (6 digits after decimal) for compatibility with the PostgreSQL wire protocol.
By default, CockroachDB interprets truncated dates (e.g., 12-16-06) as MM-DD-YY. To change the input string format of truncated dates, set the datestyle or the sql.defaults.datestyle .
Use instead of the
sql.defaults.* . This allows you to set a default value for all users for any that applies during login, making the sql.defaults.* cluster settings redundant.Size
ATIMESTAMP/TIMESTAMPTZ column supports values up to 12 bytes in width, but the total storage size is likely to be larger due to CockroachDB metadata.
Precision
CockroachDB supports precision levels from 0 (seconds) to 6 (microseconds) forTIMESTAMP/TIMESTAMPTZ values. Precision in time values specifies the number of fractional digits retained in the seconds field. For example, specifying a TIMESTAMPTZ value as TIMESTAMPTZ(3) truncates the time component to milliseconds. By default, TIMESTAMP/TIMESTAMPTZ values have a precision of 6 (microseconds).
You can use an statement to change the precision level of a TIMESTAMP/TIMESTAMPTZ-typed column. If there is already a non-default precision level specified for the column, the precision level can only be changed to an equal or greater precision level. For an example, see Create a table with a TIMESTAMP-typed column, with precision.
Supported casting and conversion
TIMESTAMP values can be to any of the following data types:
| Type | Details |
|---|---|
DECIMAL | Converts to number of seconds since the Unix epoch (Jan. 1, 1970). |
FLOAT | Converts to number of seconds since the Unix epoch (Jan. 1, 1970). |
TIME | Converts to the time portion (HH:MM:SS) of the timestamp. |
INT | Converts to number of seconds since the Unix epoch (Jan. 1, 1970). |
DATE | Converts to the date (YYYY-MM-DD) of the timestamp and omits the other information. |
STRING | Converts to the date and time portion (YYYY-MM-DD HH:MM:SS) of the timestamp and omits the time zone offset. |
Infinity TIMESTAMP casts
CockroachDB does not support an infinity/-infinity representation for TIMESTAMP casts. Instead, infinity::TIMESTAMP evaluates to 294276-12-31 23:59:59.999999+00:00, the maximum TIMESTAMP value supported, and -infinity::TIMESTAMP evaluates to -4714-11-24 00:00:00+00:00, the minimum TIMESTAMP value supported.
Note that this behavior differs from PostgreSQL, for which infinity is higher than any allowable TIMESTAMP value (including 294276-12-31 23:59:59.999999+00:00), and -infinity is lower than any allowable TIMESTAMP value (including -4714-11-24 00:00:00+00:00).
Examples
Create a table with a TIMESTAMPTZ-typed column
Create a table with a TIMESTAMP-typed column, with precision
TIMESTAMP can be changed to TIMESTAMPTZ, and TIMESTAMPTZ can be changed to TIMESTAMP:
If a non-default precision level has already been specified, you cannot change the precision to a lower level.
b column, which is of type TIMESTAMPTZ(5), cannot be changed to a precision level below 5:
Convert a TIMESTAMP to seconds since epoch
Convert a TIMESTAMP to milliseconds since epoch
Convert a TIMESTAMP to microseconds since epoch
Convert an INT (seconds since epoch) to timestamp
Convert a STRING (seconds since epoch) to timestamp
Convert an INT (milliseconds since epoch) to timestamp
Note that TIMESTAMP epoch' is the equivalent of 0::timestamp.

