我的表中有两个 TIMESTAMP 列:customer_birthday 和purchase_date。我想创建一个查询来显示按客户年龄划分的购买数量,以创建图表。
但如何使用 BigQuery 计算年龄(以年为单位)?换句话说,如何获得两个 TIMESTAMP 之间的年份差异?由于闰年,无法使用天或小时进行年龄计算,因此该函数DATEDIFF(<timestamp1>,<timestamp2>)
不合适。
谢谢。
首先,我真的很喜欢 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)
您可以计算如果所有年份都是 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 日还有一年,但我认为这听起来像是预期的行为。
归档时间: |
|
查看次数: |
8958 次 |
最近记录: |