DuckDB provides us with a bunch of epoch...()
functions that enable us to get the Unix epoch time from a given date/time value. Different functions return their result using different units (for example seconds, milliseconds, etc). The epoch_us()
function returns its result in microseconds.
Unix epoch time is typically expressed as the number of seconds that have elapsed since January 1, 1970 (UTC), but epoch_us()
function returns the equivalent amount in microseconds.
Syntax
The syntax for the epoch_us()
function goes like this:
epoch_us(timestamp)
Where timestamp
is the timestamp that we want converted to the Unix epoch.
Here’s a more detailed depiction of the syntax:
epoch_us(DATE) -> BIGINT
epoch_us(TIMESTAMP) -> BIGINT
epoch_us(INTERVAL) -> BIGINT
epoch_us(TIME) -> BIGINT
epoch_us(TIME WITH TIME ZONE) -> BIGINT
epoch_us(TIMESTAMP WITH TIME ZONE) -> BIGINT
This shows us that we can pass a variety of different date/time values, and each one results in the epoch time being returned as a BIGINT
.
Examples
Here are some examples that demonstrate epoch_us()
with different date/time types.
Passing a DATE
Value
SELECT epoch_us(DATE '2045-12-18');
Output:
+--------------------------------------+
| epoch_us(CAST('2045-12-18' AS DATE)) |
+--------------------------------------+
| 2397168000000000 |
+--------------------------------------+
Passing a TIMESTAMP
Value
SELECT epoch_us(TIMESTAMP '2045-12-18 13:15:27');
Output:
+----------------------------------------------------+
| epoch_us(CAST('2045-12-18 13:15:27' AS TIMESTAMP)) |
+----------------------------------------------------+
| 2397215727000000 |
+----------------------------------------------------+
Passing an INTERVAL
Value
SELECT epoch_us(INTERVAL '10 years 7 months 14 days 3 hours 20 minutes');
Output:
+----------------------------------------------------------------------------+
| epoch_us(CAST('10 years 7 months 14 days 3 hours 20 minutes' AS INTERVAL)) |
+----------------------------------------------------------------------------+
| 330405600000000 |
+----------------------------------------------------------------------------+
Passing a TIME
Value
SELECT epoch_us(TIME '13:15:27');
Output:
+------------------------------------+
| epoch_us(CAST('13:15:27' AS TIME)) |
+------------------------------------+
| 47727000000 |
+------------------------------------+
Passing a TIMETZ
Value
We can pass TIME WITH TIME ZONE
values, also known as TIMETZ
values:
SELECT epoch_us(TIMETZ '07:51:34+12:30');
Output:
+---------------------------------------------------------+
| epoch_us(CAST('07:51:34+12:30' AS TIME WITH TIME ZONE)) |
+---------------------------------------------------------+
| 28294000000 |
+---------------------------------------------------------+
Passing a TIMESTAMPTZ
Value
We can pass TIMESTAMP WITH TIME ZONE
values, also known as TIMESTAMPTZ
values:
SELECT epoch_us(TIMESTAMPTZ '2034-12-18 18:16:27+12:00');
Output:
+-------------------------------------------------------------------------+
| epoch_us(CAST('2034-12-18 18:16:27+12:00' AS TIMESTAMP WITH TIME ZONE)) |
+-------------------------------------------------------------------------+
| 2050035387000000 |
+-------------------------------------------------------------------------+
More epoch...()
Functions
DuckDB provides some other functions that we can use when working with epoch times:
epoch()
: Returns the total number of seconds since the epoch.epoch_ms()
: Returns the total number of milliseconds since the epoch. This function can also be used the other way around; to convert integer milliseconds since the epoch to a timestamp.epoch_ns()
: Return the total number of nanoseconds since the epoch.