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 中要简单得多。