BigQuery 将 RFC 1123 日期格式字符串转换为 unixtime
Posted
技术标签:
【中文标题】BigQuery 将 RFC 1123 日期格式字符串转换为 unixtime【英文标题】:BigQuery Convert RFC 1123 Date Format String to unixtime 【发布时间】:2014-07-17 16:16:15 【问题描述】:我正在解析一些 HTTP 标头字段,我的输入是 RFC 1123 格式的日期时间。例如:“格林威治标准时间 2012 年 11 月 21 日星期三 23:10:20”
我需要将上述字符串转换为 BigQuery 中的标准 TIMESTAMP 日期类型,这意味着我需要将其转换为 YYYY-MM-DD HH:MM:SS[.uuuuuu]。我想知道前进的最佳方式是什么。我最初的方法是多次使用 REGEXP_REPLACE,但我确信有更好的方法。
使用strftime 格式的输入格式将是 '%a,%d %b %Y %H:%M:%S' 需要以某种方式转换为 YYYY-MM-DD HH:MM:SS
告诉我
【问题讨论】:
你使用什么后端语言? 这是关于 BigQuery 所以答案是这里支持 SQL:developers.google.com/bigquery/query-reference 【参考方案1】:在 Python 中你可以这样做:
import datetime
from dateutil import parser
date_object = parser.parse('Wed, 21 Nov 2012 23:10:20 GMT')
date_object.strftime('%Y-%m-%d %H:%M:%S GMT')
【讨论】:
谢谢。 Python 或任何其他语言都不会简单地工作:使用 SQL 使用此处列出的名词/动词重新构建它:developers.google.com/bigquery/query-reference【参考方案2】:在 SQL 中解决此问题的方法过于复杂:
SELECT TIMESTAMP(SUBSTR(date, 13, 4)+'/'+month_number+'/'+SUBSTR(date, 6, 2)+' '+SUBSTR(date, 18, 8)) ts
FROM
(SELECT 'Wed, 21 Aug 2012 23:10:20 GMT' date) a
CROSS JOIN
(SELECT STRING(POSITION(month)) month_number, month FROM (SELECT SPLIT(months) month
FROM (SELECT 'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec' months))) b
WHERE SUBSTR(date, 9, 3)=b.month
用你自己的表替换(SELECT 'Wed, 21 Aug 2012 23:10:20 GMT' date)
。
【讨论】:
【参考方案3】:我终于在下面的 SQL 中找到了一个乏味但有效的解决方案,我相信它有很大的机会提高它的效率
select DATE(
regexp_replace(
regexp_replace(
regexp_replace(
regexp_replace(
regexp_replace(
regexp_replace(
regexp_replace(
regexp_replace(
regexp_replace(
regexp_replace(
regexp_replace(
regexp_replace(
regexp_replace(
regexp_replace(
regexp_replace(<insert_date>,
r'(Mon|Tue|Wed|Thu|Fri|Sat|Sun)[,] ',''),
r' GMT',''),
r'Jan', '01'),
r'Feb', '02'),
r'Mar', '03'),
r'Apr', '04'),
r'May', '05'),
r'Jun', '06'),
r'Jul', '07'),
r'Aug', '08'),
r'Sep', '09'),
r'Oct', '10'),
r'Nov', '11'),
r'Dec', '12'),
r'(\S+)\s(\S+)\s(\S+)\s(\S+)',r'\3-\2-\1 \4'))
from <table>;
【讨论】:
我现在发现了这个bigqueri.es/t/…,很好:) 是的,那是我的最终目标,而这个查询是第一个到达那里的子问题以上是关于BigQuery 将 RFC 1123 日期格式字符串转换为 unixtime的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 XSLT 2.0 获取当前日期时间的 RFC1123 日期格式