使用以下查询检索上周的数据,但我得到的错误为
Postgres错误:“CAST”位置或附近的语法错误:127
我不知道错误在哪里:

SELECT count(*), extract(day from createdon) AS period
FROM orders
WHERE servicename =:serviceName AND  createdon BETWEEN
    CAST(NOW() AS CAST(DATE-EXTRACT(DOW FROM NOW()) AS INTEGER-7)) AND
    CAST(NOW() AS CAST(DATE-EXTRACT(DOW from NOW()) AS INTEGER))
GROUP BY  extract(day from createdon)
ORDER BY extract(day from createdon);

最佳答案

你太复杂了。要获取上周的数据,只需获取“本周开始”减去7天后的所有数据:
“本周开始”可以使用date_trunc('week', current_date)进行评估。
如果你减去7天,你就会得到上一周的开始:date_trunc('week', current_date) - interval '7' day。如果你减去1天,你就得到上一周的结束。
date_trunc总是使用星期一作为一周的开始,因此如果您的一周从星期日开始,只需再减去一个,例如date_trunc('week', current_date)::date - 8将是前一周的星期日
把这些放在一起你会得到:

SELECT count(*), extract(day from createdon) AS period
FROM orders
WHERE servicename =:serviceName
  AND createdon
      between date_trunc('week', current_date)::date - 7
          and date_trunc('week', current_date)::date - 1
GROUP BY extract(day from createdon)
ORDER BY extract(day from createdon);

如果您的列是时间戳列,则可以将createdon强制转换为一个日期以删除时间部分:
  AND createdon::date
      between date_trunc('week', current_date)::date - 7
          and date_trunc('week', current_date)::date

请注意,createdon上的常规索引不会用于该条件,如果需要性能,则需要在createdon::date上创建索引。
如果您不能(或不想)创建这样的索引,则需要使用不同的索引,然后between
  AND createdon >= date_trunc('week', current_date)::date - 7
  AND createdon < date_trunc('week', current_date)::date

(注意使用<而不是<=,这正是been使用的)
另一个选项是将日期信息转换为周和年的组合:
AND to_char(createdon, 'iyyy-iw') = to_char(date_trunc('week', current_date)::date - 7, 'iyyy-iw')

注意,我在上面使用了ISO week definition。如果您使用的是不同的周编号系统,则需要使用不同的format mask来实现to_char()功能。

关于sql - 从具有创建日期的表中获取上周的数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41714363/

10-11 07:58