使用 date_add 函数和 BQ 的时间间隔翻译 MYSQL 查询的问题

Posted

技术标签:

【中文标题】使用 date_add 函数和 BQ 的时间间隔翻译 MYSQL 查询的问题【英文标题】:Problems with translating MYSQL query using date_add function and time intervals for BQ 【发布时间】:2015-06-19 21:43:50 【问题描述】:

我有一个在我们的 mysql 数据库上运行的查询。它需要永远运行,所以我想改用 BigQuery。相关表(a.xxx)已经在云端,我已经尝试调整 BQ 的代码,但我没有任何运气。该查询主要提取每天购买的个人数量,以及在首次购买后 1-7 天再次购买的那些相同个人的数量。我将不胜感激!!!!

这是查询:

    select f.fts_date, 
count(distinct f.FTS_id) as FTS_count, 
count(distinct s.passportid) as SVS_count, 
(count(distinct s.passportid)/count(distinct f.FTS_id)) as return_rate 

from

(select passportid as FTS_id,addressid, date(signdatetime) as FTS_date from a.xxx
where  date(signdatetime)>'2015-6-10'  and fts="Y" and disposition="accepted") as f

left join a.xxx as s
on f.passportid=s.passportid and f.addressid=s.addressid and s.disposition="accepted" and 
s.signdatetime between date_add(f.signdatetime, 1, "DAY") and date_add(f.signdatetime, 7, "DAY")  

group by 1

【问题讨论】:

可以添加a.xxx表的表定义吗?同样这一行:和fts =“N”看起来很有趣:别名(fts)如何成为值“N”。也许最好不要使用也是列名的别名。 我更改了别名和一些列名,以减少混乱。最初,我对其进行了更改,以使代码更通用,以便将其发布在在线论坛上。 相关列的模式:passportid, integer, nullable addressid,integer,nullable signdatetime, timestamp, nullable 当前错误是:错误:ON 子句必须是 AND of = 每个表中一个字段名的比较,所有字段名都以表名为前缀。 请更好地格式化您的代码(使用更多换行符)。还要在您的问题中添加架构请求或类似的内容,以便每次都变得更具可读性。话虽如此:试试这个:替换: s.signdatetime 在 date_add(f.signdatetime, 1, "DAY") 和 date_add(f.signdatetime, 7, "DAY") 之间: s.signdatetime > date_add(f.signdatetime, 1, "DAY") 和 s.signdatetime 【参考方案1】:

BigQuery 不支持 DATE_ADD 函数中的 INTERVAL 关键字,您应该将其写为

date_add(FTS_date, 1, "DAY")

详情请见https://cloud.google.com/bigquery/query-reference#datetimefunctions

【讨论】:

感谢更改代码。现在我收到此错误:错误:ON 子句必须是 AND of = 每个表中一个字段名称的比较,所有字段名称都以表名称为前缀。 @Srini 嗨,Srini,我认为这最好作为一个新问题提出,而不仅仅是对答案的评论。

以上是关于使用 date_add 函数和 BQ 的时间间隔翻译 MYSQL 查询的问题的主要内容,如果未能解决你的问题,请参考以下文章

MySQL DATE_ADD函数

mysql时间相加函数DATE_ADD()

mysql中date_add()函数的使用?

MySQL更新时间

MySQL - DATE_ADD 月间隔

Mysql 更新时间(加上或者减去一段时间)