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 日期格式

java中将RFC1123日期时间格式化

将datetime-format从RFC1123转换为DateTime-Object

RFC-1123 的 DateTime 给出了不准确的时区

python中的RFC 1123

需要帮助为 Google API 格式化日期时间时区