0

我有以下查询

`SELECT t.client_id, 
 count(t.client_id) as trips_xdays
 FROM trips t
 JOIN users u ON t.client_id = u.usersid
 WHERE t.city_id = 12
 AND t.status = 'completed'
 AND ( date_trunc('day',t.dropoff_at) - date_trunc('day',u.creationtime) <= 30 days,    0:00:00)
 GROUP BY t.client_id`

当我尝试将查询限制在 <= 30 天,0:00:00 时出现错误。但是,自从我查询以来,我认为这将是正确的格式

 `select date_trunc('day',t.dropoff_at) - date_trunc('day',u.creationtime)
 from trips t 
 inner join users u ON t.client_id = u.usersid`

它本身并以 30 天 0:00:00 的格式返回响应

关于如何正确查询的任何建议,以便我可以将查询限制在 <= 30 天?

4

3 回答 3

3

假设我们正在处理数据类型timestamp,您可以简化:

SELECT t.client_id, count(t.client_id) AS trips_xdays
FROM   trips t
JOIN   users u ON t.client_id = u.usersid
WHERE  t.city_id = 12
AND    t.status = 'completed'
AND    t.dropoff_at::date < u.creationtime::date + 30
GROUP  BY 1;

迄今为止的简单演员表更短,您只需添加integerdate.

或者对于稍微不同的结果和更快的执行:

...
AND    t.dropoff_at < u.creationtime + interval '30 days'

最后一种形式可以更容易地使用普通索引。它精确测量 30 天。

于 2013-06-07T07:02:17.920 回答
0

看起来我只是忘记了引号。查询的工作顺序是:

SELECT t.client_id, 
count(t.client_id) as trips_xdays
FROM trips t
JOIN users u ON t.client_id = u.usersid
WHERE t.city_id = 12
AND t.status = 'completed'
AND ( date_trunc('day',t.dropoff_at) - date_trunc('day',u.creationtime) <= '30 days,      0:00:00')
GROUP BY t.client_id
于 2013-06-07T06:22:45.907 回答
0

从头顶写出来,请验证正确性:

`SELECT t.client_id, 
 count(t.client_id) as trips_xdays
 FROM trips t
 JOIN users u ON t.client_id = u.usersid
 WHERE t.city_id = 12
 AND t.status = 'completed'
 AND ( DATEDIFF(day,t.dropoff_at,u.creationtime) <= 30)
 GROUP BY t.client_id`

我还要补充一点,虽然我对 date_trunc 方法不够熟悉,但<= 30 days在我看来,使用它是一个很大的语法错误,应该使用 30,结合输出看起来像 30 没有字符串后缀。

为了让事情更清楚,比较字符串以实际比较数字是恕我直言的不好做法。

datediff 用法的来源:

日期差异用法

其他相关提示

于 2013-06-07T06:23:12.547 回答