BigQuery Legacy SQL:将字符串转换为日期
BigQuery Legacy SQL: Convert String to Date
希望将“04-OCT-16”形式的字符串转换为时间戳。最好在 Legacy SQL.
looking to convert a string of the form '04-OCT-16' to a timestamp
强烈建议尽可能使用 BigQuery Standard SQL
#standardsql
SELECT PARSE_TIMESTAMP('%d-%b-%y', '04-OCT-16')
如果您想使用 Legacy SQL,一个可能的解决方案是将字符串格式的“月份”映射到数字,然后您可以使用 TIMESTAMP() 旧版 SQL 中的函数。一个示例是使用 REGEXP_REPLACE() 函数将所有月份一一映射:
SELECT TIMESTAMP( REGEXP_REPLACE( REGEXP_REPLACE( REGEXP_REPLACE( REGEXP_REPLACE( REGEXP_REPLACE( REGEXP_REPLACE( REGEXP_REPLACE( REGEXP_REPLACE( REGEXP_REPLACE( REGEXP_REPLACE( REGEXP_REPLACE( REGEXP_REPLACE('04-JAN-16','JAN','01'), 'FEB', '02'), 'MAR', '03'), 'ABR', '04'), 'MAY', '05'), 'JUN', '06'), 'JUL', '07'), 'AUG', '08'), 'SEP', '09'), 'OCT', '10'), 'NOV', '11'),'DEC', '12') AS YOURTIMESTAMP;
您也可以创建一个 table 来进行映射。在这种情况下,您需要连接两个 table 并使用函数 REGEXP_EXTRACT()。就我而言,我有一个名为“month_mapping”的 table 用于映射:
MONTH_STRING MONTH_NUMBER
JAN 01
FEB 02
MAR 03
ABR 04
MAY 05
JUN 06
JUL 07
AUG 08
SEP 09
OCT 10
NOV 11
DEC 12
并且我在数据集“my_test”的 table“测试”中有一个字符串形式为“04-OCT-16”的列作为“测试”,然后我使用这个查询做映射:
SELECT
REGEXP_REPLACE(test,REGEXP_EXTRACT(test,r'.\-([a-zA-Z]+)\-.'), MONTH_NUMBER)
FROM
my_test.test a
JOIN
my_test.month_mapping b
ON
REGEXP_EXTRACT(a.test,r'.\-([a-zA-Z]+)\-.') = b.MONTH_STRING
如果您对旧版 SQL 有进一步的疑问,Google Doc 中有关于旧版 SQL 函数和运算符的完整文档。
这适用于 BigQuery legacy SQL 日期 'string' YYYYMMDD:
STRFTIME_UTC_USEC((PARSE_UTC_USEC (CONCAT(left(string,4),'-',left(right(string, 4),2),'-',right(string ,2),' 00:00:00'))),"%Y-%m-%d") as myDateField
注意“00:00:00”中的 space
将字符串转换为日期在传统 sql 中是一个痛苦的过程,但在标准 SQL 中要简单得多。
希望将“04-OCT-16”形式的字符串转换为时间戳。最好在 Legacy SQL.
looking to convert a string of the form '04-OCT-16' to a timestamp
强烈建议尽可能使用 BigQuery Standard SQL
#standardsql
SELECT PARSE_TIMESTAMP('%d-%b-%y', '04-OCT-16')
如果您想使用 Legacy SQL,一个可能的解决方案是将字符串格式的“月份”映射到数字,然后您可以使用 TIMESTAMP() 旧版 SQL 中的函数。一个示例是使用 REGEXP_REPLACE() 函数将所有月份一一映射:
SELECT TIMESTAMP( REGEXP_REPLACE( REGEXP_REPLACE( REGEXP_REPLACE( REGEXP_REPLACE( REGEXP_REPLACE( REGEXP_REPLACE( REGEXP_REPLACE( REGEXP_REPLACE( REGEXP_REPLACE( REGEXP_REPLACE( REGEXP_REPLACE( REGEXP_REPLACE('04-JAN-16','JAN','01'), 'FEB', '02'), 'MAR', '03'), 'ABR', '04'), 'MAY', '05'), 'JUN', '06'), 'JUL', '07'), 'AUG', '08'), 'SEP', '09'), 'OCT', '10'), 'NOV', '11'),'DEC', '12') AS YOURTIMESTAMP;
您也可以创建一个 table 来进行映射。在这种情况下,您需要连接两个 table 并使用函数 REGEXP_EXTRACT()。就我而言,我有一个名为“month_mapping”的 table 用于映射:
MONTH_STRING MONTH_NUMBER
JAN 01
FEB 02
MAR 03
ABR 04
MAY 05
JUN 06
JUL 07
AUG 08
SEP 09
OCT 10
NOV 11
DEC 12
并且我在数据集“my_test”的 table“测试”中有一个字符串形式为“04-OCT-16”的列作为“测试”,然后我使用这个查询做映射:
SELECT
REGEXP_REPLACE(test,REGEXP_EXTRACT(test,r'.\-([a-zA-Z]+)\-.'), MONTH_NUMBER)
FROM
my_test.test a
JOIN
my_test.month_mapping b
ON
REGEXP_EXTRACT(a.test,r'.\-([a-zA-Z]+)\-.') = b.MONTH_STRING
如果您对旧版 SQL 有进一步的疑问,Google Doc 中有关于旧版 SQL 函数和运算符的完整文档。
这适用于 BigQuery legacy SQL 日期 'string' YYYYMMDD:
STRFTIME_UTC_USEC((PARSE_UTC_USEC (CONCAT(left(string,4),'-',left(right(string, 4),2),'-',right(string ,2),' 00:00:00'))),"%Y-%m-%d") as myDateField
注意“00:00:00”中的 space
将字符串转换为日期在传统 sql 中是一个痛苦的过程,但在标准 SQL 中要简单得多。