CAST function. Definition, syntax, examples and common errors using BigQuery Standard SQL. CAST allows you to convert to different Data Types in BigQuery.
The CAST function allows you to convert between different Data Types in BigQuery.
Where typename is any of:
CAST (expr AS typename)INT64, NUMERIC, BIGNUMERIC, FLOAT64, BOOL, STRING, BYTES, DATE, DATETIME, TIME, TIMESTAMP, ARRAY, STRUCTYou can read more about each type here.
| str_number | number |
|---|---|
| 3 | 3 |
| 8 | 8 |
| 23 | 23 |
STRINGs to DATEsSELECT
str_number,
CAST(TRIM(str_number) AS INT64) AS number
FROM
(
SELECT
' 3' AS str_number
UNION ALL
( SELECT
'8 ' AS str_number)
UNION ALL
( SELECT
' 23' AS str_number)
) AS table_3When converting a STRING to DATE, the STRING must be in the format: YYYY-MM-DD
| date1 | date2 | formatted_date2 |
|---|---|---|
| null | 2020-02-01 | Feb 01,2020 |
In the example above date1 returns a NULL value since it's not in the right format. To re-format your strings check out the page.
Similar rules apply for converting STRINGs to DATETIME, TIMESTAMP, and TIME:
SELECT
safe_CAST(date1 AS DATE) AS date1,
safe_CAST(date2 AS DATE) AS date2,
FORMAT_DATE('%b %d,%Y', safe_CAST(date2 AS DATE)) AS formatted_date2
FROM
(
SELECT
'2/1/20' AS date1,
'2020-02-01' AS date2
) AS table_1When casting STRING -> DATETIME, the string must be in the format YYYY:MM:DD HH:MM:SS
| str_to_datetime |
|---|
| 2020-12-25T03:22:01 |
When casting STRING -> TIMESTAMP the string must be in a format YYYY:MM:DD HH:MM:SS [timestamp] (where the timestamp defaults to UTC if not specified)
| str_to_timestamp |
|---|
| 2020-12-25T08:22:01.000Z |
When casting STRING->TIME the string must be in the format HH:MM:SS
| str_to_time |
|---|
| 15:03:11 |
BOOLsSELECT
CAST('2020-12-25 03:22:01' AS DATETIME) AS str_to_datetimeWhen converting to BOOLs (Booleans, True/False) from other types there are a few rules to keep in mind:
SELECT
CAST('2020-12-25 03:22:01-5:00' AS TIMESTAMP) AS str_to_timestampINT64 -> BOOL: Returns FALSE for 0, TRUE otherwise.
| zero_to_bool | five_to_bool |
|---|---|
| false | true |
STRING -> BOOL: Returns TRUE for 'true', FALSE for 'false', NULL otherwise.
| true_to_bool | false_to_bool | apples_to_bool |
|---|---|---|
| true | false | null |
STRING to a DATE?select cast('15:03:11' as TIME) as str_to_timeLet's say you have a stringifed date that's not formatted in the standard YYYY-MM-DD, how do you cast it to be a date?
There are 2 options:
SELECT
CAST(0 AS BOOL) AS zero_to_bool,
CAST(5 AS BOOL) AS five_to_boolUse PARSE_DATE where you can specify the exact syntax of your string:
SELECT
SAFE_CAST('true' AS BOOL) AS true_to_bool,
SAFE_CAST('false' AS BOOL) AS false_to_bool,
SAFE_CAST('apples' AS BOOL) AS apples_to_bool| f0_ |
|---|
| 2020-01-03 |
Use STRING manipulation to reconstruct your string and CAST to the right format:
SELECT
PARSE_DATE('%m/%d/%Y', '1/3/2020')| date_from_str |
|---|
| 2020-12-03 |
TIMESTAMP?SELECT
CAST(CONCAT(REGEXP_EXTRACT(str_date, r'\/([0-9]{4})'), "-", REGEXP_EXTRACT(str_date, r'([0-9]{1,2})\/'), "-", REGEXP_EXTRACT(str_date, r'\/([0-9]{1,2})\/')) AS DATE) AS date_from_str
FROM
(
SELECT
'12/3/2020' AS str_date
) AS table_1Epochs, or Unix time are the seconds since 1970-01-01 00:00:00 UTC. To make them usable for analysis, you'll need to convert them to a DATETIME or TIMESTAMP.
To do this, you can again make use of PARSE_DATETIME, or PARSE_TIMESTAMP if your epoch is a STRING.
| parse_timestamp_s_1611592773 |
|---|
| 2021-01-25T16:39:33.000Z |
Or if your Epoch is an INT64, use the following functions: TIMESTAMP_SECONDS, TIMESTAMP_MILLIS, TIMESTAMP_MICROS, UNIX_SECONDS, UNIX_MILLIS, UNIX_MICROS.
SELECT parse_timestamp('%s', '1611592773')| formatted_timestamp |
|---|
| 2021-01-25T16:39:33.000Z |
SELECT
TIMESTAMP_SECONDS(1611592773) AS formatted_timestampCAST to NUMERIC to turn a Scientific Notation column to a decimal:
SELECT sci, cast(sci as NUMERIC) sci_numeric FROM (
SELECT
(15000000.0 + 17000000.01) AS sci)| sci | sci_numeric |
|---|---|
| 32000000.01 | 32000000.010000002 |
Check the format of your string when converting to a DATE. Remember it must be in YYYY-MM-DD . But also try PARSE_DATE if you're looking for something to read a specific format.