【问题标题】:Extract Month and Year from timestamp in Bigquery从 Bigquery 的时间戳中提取月份和年份
【发布时间】:2018-06-20 18:38:39
【问题描述】:

我想从时间戳列(YYYYMMDD HHMMSS)中提取月份和年份,如果月份为 1,它应该创建一个名为“January”的列,月份为 2,它应该创建一个名为“February”的列。

这是我尝试过但没有运气的查询。

SELECT
  SUM(case when extract(month() from timestamp) = 1 and extract(year() from timestamp) = '2018' then total else 0 end ) as January ,
  SUM(case when extract(month() from timestamp) = 2 and extract(year() from timestamp) = '2018' then total else 0 end ) as February, and so on until December..

FROM x;

【问题讨论】:

  • 您使用的是哪个 dbms?
  • 我正在使用关系数据库
  • 哪个rdbms? mysql? sqlserver?甲骨文?
  • 我正在使用 oracle
  • 那么,如果您使用的是 Oracle,为什么要使用 BigQuery 对其进行标记?!

标签: google-bigquery


【解决方案1】:

我猜你正在寻找这个

SELECT
  FORMAT_DATETIME('%B', DATETIME '2008-12-25 15:30:00')
  AS formatted;

所以DATETIME 将您的字符串转换为日期时间格式,format_datetime() 获取月份名称

【讨论】:

  • 您在上面的 cmets 中说您使用的是 Oracle。
  • 在 bigquery 中,我们使用类似 SQL 的 oracle
  • 这没有意义
【解决方案2】:

我不明白您的评论“在 bigquery 中,我们使用类似 SQL 的 oracle”,所以我只是假设您在 BigQuery 中使用普通的标准 SQL。

你的 SQL 有点奇怪,没有多大意义,但这里有一个关于公共数据集的工作示例。您需要更改时间戳列以匹配您的,我不知道total 是什么,所以我刚刚做了1

SELECT
  SUM(CASE
      WHEN EXTRACT(month  FROM  community_owned_date ) = 1 AND EXTRACT(year  FROM  community_owned_date ) = 2017 THEN 1
      ELSE 0
    END ) AS January,
  SUM(CASE
      WHEN EXTRACT(month  FROM  community_owned_date ) = 2 AND EXTRACT(year  FROM  community_owned_date ) = 2017 THEN 1
      ELSE 0
    END ) AS February
FROM
  `bigquery-public-data.stackoverflow.posts_answers`

【讨论】:

  • 当我在第 3 行第 32 列运行此查询“遇到”“FROM”“FROM”时出现错误。期待:“)”...”
  • 你需要enable standard SQL
【解决方案3】:

以下是 BigQuery StandardSQL

#standardsQL
CREATE TEMP FUNCTION monthValue(ts TIMESTAMP, m INT64, y INT64, value INT64) AS (
  IF(EXTRACT(MONTH FROM ts) = m AND EXTRACT(YEAR FROM ts) = y, value, 0) 
);
SELECT
  SUM(monthValue(timestamp, 1, 2018, total)) AS January,
  SUM(monthValue(timestamp, 2, 2018, total)) AS February,
  SUM(monthValue(timestamp, 3, 2018, total)) AS March,
  SUM(monthValue(timestamp, 4, 2018, total)) AS April,
  SUM(monthValue(timestamp, 5, 2018, total)) AS May,
  SUM(monthValue(timestamp, 6, 2018, total)) AS June,
  SUM(monthValue(timestamp, 7, 2018, total)) AS July,
  SUM(monthValue(timestamp, 8, 2018, total)) AS August,
  SUM(monthValue(timestamp, 9, 2018, total)) AS September,
  SUM(monthValue(timestamp, 10, 2018, total)) AS October,
  SUM(monthValue(timestamp, 11, 2018, total)) AS November,
  SUM(monthValue(timestamp, 12, 2018, total)) AS December
FROM
  `yourproject.yourdataset.yourtable`

我们可以在旧版 SQL 中执行此操作吗?

对于旧版 SQL,请参见下文

#legacySQL
SELECT
  SUM(IF(MONTH(timestamp) = 1 AND YEAR(timestamp) = 2018, total, 0)) AS January,
  SUM(IF(MONTH(timestamp) = 2 AND YEAR(timestamp) = 2018, total, 0)) AS February,
  SUM(IF(MONTH(timestamp) = 3 AND YEAR(timestamp) = 2018, total, 0)) AS March,
  SUM(IF(MONTH(timestamp) = 4 AND YEAR(timestamp) = 2018, total, 0)) AS April,
  SUM(IF(MONTH(timestamp) = 5 AND YEAR(timestamp) = 2018, total, 0)) AS May,
  SUM(IF(MONTH(timestamp) = 6 AND YEAR(timestamp) = 2018, total, 0)) AS June,
  SUM(IF(MONTH(timestamp) = 7 AND YEAR(timestamp) = 2018, total, 0)) AS July,
  SUM(IF(MONTH(timestamp) = 8 AND YEAR(timestamp) = 2018, total, 0)) AS August,
  SUM(IF(MONTH(timestamp) = 9 AND YEAR(timestamp) = 2018, total, 0)) AS September,
  SUM(IF(MONTH(timestamp) = 10 AND YEAR(timestamp) = 2018, total, 0)) AS October,
  SUM(IF(MONTH(timestamp) = 11 AND YEAR(timestamp) = 2018, total, 0)) AS November,
  SUM(IF(MONTH(timestamp) = 12 AND YEAR(timestamp) = 2018, total, 0)) AS December
FROM [yourproject:yourdataset.yourtable]  

注意:BigQuery 团队非常推荐migrate to Standard SQL

【讨论】:

  • 我们可以在旧版 SQL 中执行此操作吗??
【解决方案4】:

你可以试试:

SELECT CONCAT(CAST(EXTRACT(YEAR FROM DATE (OrderDate)) AS STRING),"-",CAST(EXTRACT(MONTH FROM DATE (OrderDate)) AS STRING)) AS yyyy_mm

【讨论】:

    【解决方案5】:

    回答问题的标题,因为可能其他人会像我一样在这里寻找一种从 BigQuery 时间戳创建 YYYYMM 年月的方法。

    这是我在标准 SQL 中最终得到的代码:

    CONCAT(CAST(EXTRACT(YEAR from timestamp) as string), LPAD(CAST(EXTRACT(MONTH from timestamp) as string),2,'0') ) as yearmonth

    【讨论】:

    • 我如何在两个单独的列中获取这些,两个不同的提取不起作用
    • 所以这行不通?遗憾的是,我目前没有 BigQuery 可以对其进行测试:CAST(EXTRACT(YEAR from timestamp) as string) as year, LPAD(CAST(EXTRACT(MONTH from timestamp) as string),2,'0') as month
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多