SQL 将 yyyymmdd 转换为 BigQuery 中的时间戳?

标签 sql timestamp google-bigquery

我试图在 SQL 中将字符串转换为时间戳。问题其实很简单,如何将这个字符串转换成当天午夜开始的时间戳?

在我的数据库中,我还在 timestamp_micros 中存储了一个字段,其中任何一个都可以工作,我认为将 micros 转换为时间戳比字符串更容易。

例如 20170118 => 时间戳

查询:

WITH allTables as (
  SELECT
      event.date as date,
      count(*) as totalSessions,
      count(DISTINCT user_dim.app_info.app_instance_id) as uniqueUsers
  FROM `namehiddenonlyhere.*`
  CROSS JOIN
      UNNEST(event_dim) AS event
  WHERE
      event.name = 'session_start'
  AND 
      event.date <= FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY))
  AND
      event.date >= FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY))
  GROUP BY event.date

  UNION ALL 
  SELECT
      event.date as date,
      count(*) as totalSessions,
      count(DISTINCT user_dim.app_info.app_instance_id) as uniqueUsers
  FROM `namehiddenonlyhere.*`
  CROSS JOIN
      UNNEST(event_dim) AS event
  WHERE
      event.name = 'session_start'
  AND 
      event.date <= FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY))
  AND
      event.date >= FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY))
  GROUP BY event.date
) SELECT 'all apps' as target, date as datapoint_time, totalSessions datapoint_value FROM allTables;

最佳答案

您可以使用 PARSE_DATEPARSE_TIMESTAMP(格式字符串相同)来获取日期或时间戳。例如:

SELECT
  d,
  PARSE_DATE('%Y%m%d', d) AS date,
  PARSE_TIMESTAMP('%Y%m%d', d) AS timestamp
FROM UNNEST(['20170117', '20161231']) AS d;

您可以在文档中阅读有关格式字符串的更多信息。有 date 的部分和 timestamp ,分别适用于 PARSE_DATEPARSE_TIMESTAMP

编辑:根据您更新的问题,您可以将查询更改为如下内容:

WITH allTables as (
  SELECT
      event.date as date,
      count(*) as totalSessions,
      count(DISTINCT user_dim.app_info.app_instance_id) as uniqueUsers
  FROM `namehiddenonlyhere.*`
  CROSS JOIN
      UNNEST(event_dim) AS event
  WHERE
      event.name = 'session_start'
  AND 
      event.date <= FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY))
  AND
      event.date >= FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY))
  GROUP BY event.date

  UNION ALL 
  SELECT
      event.date as date,
      count(*) as totalSessions,
      count(DISTINCT user_dim.app_info.app_instance_id) as uniqueUsers
  FROM `namehiddenonlyhere.*`
  CROSS JOIN
      UNNEST(event_dim) AS event
  WHERE
      event.name = 'session_start'
  AND 
      event.date <= FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY))
  AND
      event.date >= FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY))
  GROUP BY event.date
) SELECT 'all apps' as target, PARSE_DATE('%Y%m%d', date) as datapoint_time, totalSessions datapoint_value FROM allTables;

我所做的唯一修改是更改:

date AS datapoint_time

到:

PARSE_DATE('%Y%m%d', date) as datapoint_time

关于SQL 将 yyyymmdd 转换为 BigQuery 中的时间戳?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41724089/

相关文章:

sql - 使用递归公用表表达式从两个表中查找连续编号

javascript - Mongodb 长时间操作时间戳

google-analytics - 事件数据,通过 Google 跟踪代码管理器发送,在 Google Bigquery 中不可见

sql - BigQuery - 连接每行的字符串数组

mysql - 无法添加 FK 约束 #1215

php - 将包含 case 语句的 MySql 查询转换为 codeigniter 事件记录查询

c++ - 如何将 std::chrono::time_point 转换为 uint64_t?

java - 如何在jboss日志记录的模式格式化程序中自定义时间戳

sql - 合并bigquery中具有一个公共(public)值的数组

具有多重嵌套 JOIN 和不同有限排序的 MySQL 语句