I'm trying to range-join two tables, like so
SELECT *
FROM main_table h
INNER JOIN
test.delay_pairs d
ON
d.interval_start_time_utc < h.visitStartTime
AND h.visitStartTime < d.interval_end_time_utc
where h.visitStartTime
is an INT64
epoch and d.interval_start_time_utc
and d.interval_end_time_utc
are proper TIMESTAMP
s.
The above fails with
No matching signature for operator < for argument types: TIMESTAMP, INT64. Supported signature: ANY < ANY
Neither wrapping h.visitStartTime
in TIMESTAMP()
nor CAST(d.interval_start_time_utc AS INT64)
work. How do I make the two comparable in BigQuery's Standard SQL dialect?
If you are using Legacy SQL, you can use TIMESTAMP_TO_SEC to convert from timestamp to epoch. So, you can do something like this: SELECT TIMESTAMP_TO_MSEC(timestamp_column) FROM [YOUR_DATASET:YOUR_TABLE]; If you are using Standard SQL, you can use UNIX_SECONDS for the same purpose.
The format is: YYYY-MM-DD HH:MM:SS (e.g. 2021-05-15 16:45:23). Timestamp type: Date, time, and time zone information are all included in timestamps. If no time zone is given, the format falls back to UTC.
To convert any TimeZone DateTime string to UTC, one could use PARSE_TIMESTAMP using the supported TIMESTAMP Formats in BigQuery . Here PARSE_TIMESTAMP parses the IST string to a UTC TIMESTAMP (not string). Adding SAFE as prefix takes care of errors/nulls etc.
Datetime type: comprises both calendar date and time. It does not store time zone information: YYYY-MM-DD HH:MM:SS (e.g. ). Timestamp type: comprises date, time, and time zone information.
You can use timestamp conversion functions like TIMESTAMP_SECONDS
, TIMESTAMP_MILLIS
, TIMESTAMP_MICROS
for example, assuming your h.visitStartTime is microseconds since the unix epoch
SELECT *
FROM main_table h
INNER JOIN test.delay_pairs d
ON d.interval_start_time_utc < TIMESTAMP_MICROS(h.visitStartTime)
AND TIMESTAMP_MICROS(h.visitStartTime) < d.interval_end_time_utc
With standard sql you can use one of those, depending on precision:
DATE_FROM_UNIX_DATE
- from days epoch to dateTIMESTAMP_SECONDS
- from seconds epoch to timestampTIMESTAMP_MILLIS
- from milliseconds epoch to timestampTIMESTAMP_MICROS
- from microseconds epoch to timestampSee documentation here: https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators#timestamp_seconds
With legacy sql you can just use TIMESTAMP
function and multiply or divide by 1000 to bring it to needed epoch type:
SELECT
TIMESTAMP(epoch_in_millis / 1000) AS datetime
FROM
my_table
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With