如何在 BigQuery 中计算年龄?

Gil*_*zan 8 google-bigquery

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

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

谢谢。

Tho*_* W. 6

首先,我真的很喜欢 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)
)
Run Code Online (Sandbox Code Playgroud)


Jor*_*ani 0

您可以计算如果所有年份都是 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))
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我刚刚在他们的问题跟踪器上创建了[此问题](https://code.google.com/p/google-bigquery/issues/detail?id=170),以请求更多日期计算功能,包括之间的年差两个日期。 (2认同)