【问题标题】:How to calculate ages in BigQuery?如何在 BigQuery 中计算年龄?
【发布时间】:2014-12-14 02:05:39
【问题描述】:

我的表中有两个 TIMESTAMP 列:customer_birthday 和 purchase_date。我想创建一个查询来按客户年龄显示购买次数,以创建图表。

但是如何使用 BigQuery 计算年龄(以年为单位)?换句话说,我如何获得两个 TIMESTAMP 之间的年差?由于闰年,无法使用天或小时计算年龄,因此函数DATEDIFF(<timestamp1>,<timestamp2>) 不合适。

谢谢。

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    如果所有年份都是 365 天,您可以计算出天数,取其差,然后除以 365。例如:

    SELECT (day2-day1)/365 
    FROM (
      SELECT YEAR(t1) * 365 + DAYOFYEAR(t1) as day1,
             YEAR(t2) * 365 + DAYOFYEAR(t2) as day2 
      FROM (
        SELECT TIMESTAMP('20000201') as t1, 
               TIMESTAMP('20140201') as t2))
    

    这将返回 14.0,即使中间有闰年。如果您希望最终结果为整数而不是浮点数,您可以使用INTEGER() 函数来转换结果。

    请注意,如果其中一个日期是闰日(2 月 29 日),那么它似乎距离 3 月 1 日还有一年,但我认为这听起来像是预期的行为。

    【讨论】:

    • 我刚刚在他们的问题跟踪器上创建了this issue,要求提供更多日期计算功能,包括两个日期之间的年差。
    【解决方案2】:

    关于日期之间的差异 - 您可以考虑使用 JavaScript 日期库(例如 Datejs 或 Moment.js)的用户定义函数 (https://cloud.google.com/bigquery/user-defined-functions)

    【讨论】:

      【解决方案3】:

      您可以使用DATE_DIFF获取年份差,但如果今年还没有生日,则需要减一:

      IF(EXTRACT(DAYOFYEAR FROM CURRENT_DATE) < EXTRACT(DAYOFYEAR FROM birthdate),
        DATE_DIFF(CURRENT_DATE, birthdate, YEAR) - 1,
        DATE_DIFF(CURRENT_DATE, birthdate, YEAR)) AS age
      

      【讨论】:

        【解决方案4】:

        这是在用户定义的函数中:

        CREATE TEMP FUNCTION calculateAge(birthdate DATE) AS (
          DATE_DIFF(CURRENT_DATE, birthdate, YEAR) + 
          IF(EXTRACT(DAYOFYEAR FROM CURRENT_DATE) < EXTRACT(DAYOFYEAR FROM birthdate), -1, 0) -- subtract 1 if bithdate has not yet occured this year
        );
        

        【讨论】:

        • 请注意,如果当前日期是 3 月或更晚,则闰年的出生日期将不正确。由于 2 月 29 日仅存在于闰年,因此从 3 月开始的日期在闰年中的 dayofyear 值与常规年份的日期相比为 +1。反之亦然(生日为平年,当年为闰年)也不正确。
        【解决方案5】:

        首先,我真的很喜欢 BigQuery 有一个基于日期计算当前年龄的函数。这似乎是一个非常常见的用例,由于整个闰年的事情,这并不容易。

        我发现了一篇关于这个问题的好文章:https://towardsdatascience.com/how-to-accurately-calculate-age-in-bigquery-999a8417e973

        他们的最终方法类似于 Lars Haugseth 和 Saad 的答案,但他们不使用 DAYOFYEAR 部分以避免闰年问题。它还使您不仅可以灵活地计算当前年龄,还可以计算您作为参数传递给函数的特定日期的年龄:

        CREATE OR REPLACE FUNCTION workspace.age_calculation(as_of_date DATE, date_of_birth DATE)
        AS (
        DATE_DIFF(as_of_date,date_of_birth, YEAR) - 
        IF(EXTRACT(MONTH FROM date_of_birth)*100 + EXTRACT(DAY FROM date_of_birth) > 
           EXTRACT(MONTH FROM as_of_date)*100 + EXTRACT(DAY FROM as_of_date)
           ,1,0)
        )
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-11-16
          • 2017-05-26
          • 2017-08-08
          • 1970-01-01
          • 2012-03-26
          • 1970-01-01
          • 1970-01-01
          • 2020-12-28
          相关资源
          最近更新 更多