将 date_diff 以天数除以 365 以获得年数

Posted

技术标签:

【中文标题】将 date_diff 以天数除以 365 以获得年数【英文标题】:Divide date_diff in days with 365 to get number of years 【发布时间】:2021-12-05 01:52:51 【问题描述】:

当我意识到我在第 0 年收到错误的订单数量时,我在第一次购买和第二次购买之间进行了DATE_DIFF。在 2020 年 10 月和 2021 年 1 月进行了第二次订单的客户最终进入垃圾箱对于 1 年后完成第二个订单的客户 - 新订单的年份已更改,但两个订单之间只有几个月的时间。

我试图用天数而不是年份来做一个DATE_DIFF,并将它除以 365,但这给了我十进制数字作为年份。下面是我在 DataStudio 中使用的查询,我在那里按 calc_yearsBetweenFirstTwoOrders 对订单数进行分组。有谁知道如何处理这个问题?

DATE_DIFF(a.casted_order_datetime, a.first_customer_purchase_date, YEAR) AS yearsBetweenFirstTwoOrders,
DATE_DIFF(a.casted_order_datetime, a.first_customer_purchase_date, DAY) / 365 AS calc_yearsBetweenFirstTwoOrders,
DATE_DIFF(a.casted_order_datetime, a.first_customer_purchase_date, DAY) AS daysBetweenFirstTwoOrders,
DATE_DIFF(a.casted_order_datetime, a.first_customer_purchase_date, WEEK) AS weeksBetweenFirstTwoOrders,
DATE_DIFF(a.casted_order_datetime, a.first_customer_purchase_date, MONTH) AS monthsBetweenFirstTwoOrders,

CASE WHEN (DATE_DIFF(a.casted_order_datetime, a.first_customer_purchase_date, DAY) = 0) THEN 'newCustomer' 
     WHEN (DATE_DIFF(a.casted_order_datetime, a.first_customer_purchase_date, DAY) > 0) THEN 'returningCustomer' 
ELSE NULL END AS customerSegment,

CASE WHEN (article_price BETWEEN 0 AND 1000) THEN 'price 0-1000'
     WHEN (article_price BETWEEN 1000 and 2000) THEN 'price 1000-2000'
     WHEN (article_price BETWEEN 2000 and 3000) THEN 'price 2000-3000'
     WHEN (article_price BETWEEN 3000 and 4000) THEN 'price 3000-4000'
     WHEN (article_price BETWEEN 4000 and 5000) THEN 'price 4000-5000'
     WHEN (article_price BETWEEN 5000 and 6000) THEN 'price 5000-6000'
ELSE 'price > 6000' END AS article_price_binned,


from (



SELECT 
DISTINCT order_id,
first_customer_purchase_date,
CAST(TIMESTAMP(order_datetime)as DATE) as casted_order_datetime,
order_datetime as order_datetime,
customer_id,
orderrow_id,
article_title,
main_image,
article_price,
category_level_1,
category_level_2,
category_level_3,
merchant,
traffic_source,
is_return,
Order_Product_Age_Days,
order_shipping_time_max,
Quantity,
  ROW_NUMBER() OVER ( PARTITION BY customer_id ORDER BY order_datetime desc ) AS RN
  
FROM `xxxx-xxxx-xxxx.sandbox.xxxxxx`

)A

WHERE order_datetime BETWEEN PARSE_TIMESTAMP('%Y%m%d', @DS_START_DATE) 
AND PARSE_TIMESTAMP('%Y%m%d', @DS_END_DATE)

【问题讨论】:

【参考方案1】:

当您将日期差除以 365 以表示年份差时,您可以从输出中提取整数。为此,您可以将查询调整为:

CAST(REGEXP_EXTRACT(CAST(DATE_DIFF(a.casted_order_datetime, a.first_customer_purchase_date, DAY)/365 AS STRING),r'^(\d+)\.\d+') AS INT64) AS calc_yearsBetweenFirstTwoOrders

注意:我将它转换回 INT64,这样它就不会被视为字符串。

我用这个例子测试了它:

SELECT
  CAST(REGEXP_EXTRACT(CAST(DATE_DIFF(DATE '2021-01-01', DATE '2020-10-01', DAY)/365 AS STRING),r'^(\d+)\.\d+') AS INT64) AS calc_yearsBetweenFirstTwoOrders

2021-01-01 和 2020-10-01:

2021-01-01 和 2020-01-01:

2021-01-01 和 2019-06-01:

【讨论】:

非常感谢!我没有得到正则表达式 - 你能解释一下它在这种情况下的作用吗? @SevgiCamuz 对于解决方案,我使用了 REGEXP_EXTRACT,其中我使用表达式 ^(\d+)\.\d+ 来匹配 DATE_DIFF 的十进制输出。 \d 代表一个数字,\d+ 代表多个数字,^ 代表行首。有了这些,它将匹配以点分隔的数字开头并后跟数字的任何字符串。如果您注意到 \d+ 包含在 () 中,它会提取 \d+ 的值,在这种情况下是整数。 更多信息可以查看REGEXP_EXTRACT和regex syntax。

以上是关于将 date_diff 以天数除以 365 以获得年数的主要内容,如果未能解决你的问题,请参考以下文章

presto计算日期间隔天数或者小时间隔——date_diff函数使用

DATE_DIFF()

计算每年开始和结束日期之间的天数

PHP 计算两个日期间隔天数

减去两个日期时间以获得天数(python)

在 GROUP BY 查询中除以值