Javascript 如何查询postgres中最近四周的每周总数

Javascript 如何查询postgres中最近四周的每周总数,javascript,node.js,postgresql,sequelize.js,Javascript,Node.js,Postgresql,Sequelize.js,简单地说,我有一个如下所示的事务表 我试图按过去7天(逐日)、过去4周(逐周)和过去12个月(逐月)查询此表 我打算用javascript获取日期,逐事务查询,然后计算每个(周、日、月)的总和,然后创建一个数组来保存这些值。但我的直觉告诉我,通过postgres db查询可以获得大部分信息 所以我的问题是,如果是的话,有没有可能,怎么做 这是我在找约会对象 const today = new Date(); const firstWeekEnd = new Date(today); const

简单地说,我有一个如下所示的事务表

我试图按过去7天(
逐日
)、过去4周(
逐周
)和过去12个月(
逐月
)查询此表

我打算用javascript获取日期,逐事务查询,然后计算每个(周、日、月)的总和,然后创建一个数组来保存这些值。但我的直觉告诉我,通过postgres db查询可以获得大部分信息

所以我的问题是,如果是的话,有没有可能,怎么做

这是我在找约会对象

const today = new Date();
const firstWeekEnd = new Date(today);
const secondWeekStart = new Date(today);
const secondWeekEnd = new Date(today);
const thirdWeekStart = new Date(today);
const thirdWeekEnd = new Date(today);
const fourthWeekStart = new Date(today);
const fourthWeekEnd = new Date(today);

function formatDate(date) {
  let dd = date.getDate();
  let mm = date.getMonth() + 1;
  const yyyy = date.getFullYear();
  if (dd < 10) { dd = `0${dd}`; }
  if (mm < 10) { mm = `0${mm}`; }
  date = `${yyyy} ${mm}= ${dd}`;
  return date;
}

firstWeekEnd.setDate(firstWeekEnd.getDate() - 6);
secondWeekStart.setDate(secondWeekStart.getDate() - 7);
secondWeekEnd.setDate(secondWeekEnd.getDate() - 13);
thirdWeekStart.setDate(thirdWeekStart.getDate() - 14);
thirdWeekEnd.setDate(thirdWeekEnd.getDate() - 20);
fourthWeekStart.setDate(fourthWeekStart.getDate() - 21);
fourthWeekEnd.setDate(fourthWeekEnd.getDate() - 27);

const today=新日期();
const firstWeekEnd=新日期(今天);
const secondWeekStart=新日期(今天);
const secondWeekEnd=新日期(今天);
const thirdWeekStart=新日期(今天);
const thirdWeekEnd=新日期(今天);
const fourthWeekStart=新日期(今天);
const fourthWeekEnd=新日期(今天);
函数格式日期(日期){
设dd=date.getDate();
设mm=date.getMonth()+1;
const yyyy=date.getFullYear();
如果(dd<10){dd=`0${dd}`;}
如果(mm<10){mm=`0${mm}`;}
日期=`${yyyy}${mm}=${dd}`;
返回日期;
}
firstWeekEnd.setDate(firstWeekEnd.getDate()-6);
secondWeekStart.setDate(secondWeekStart.getDate()-7);
secondWeekEnd.setDate(secondWeekEnd.getDate()-13);
thirdWeekStart.setDate(thirdWeekStart.getDate()-14);
thirdWeekEnd.setDate(thirdWeekEnd.getDate()-20);
fourthWeekStart.setDate(fourthWeekStart.getDate()-21);
fourthWeekEnd.setDate(fourthWeekEnd.getDate()-27);
我正在使用nodejs和sequelize


非常感谢您提供的任何帮助或想法

如果您正在PostgreSQL中寻找某个函数来帮助您对数据进行分组,那么我会为您提供一个肯定的答案
date\u trunc('week',createdAt)
。它返回一周中的第一天,您可以按如下方式对数据进行分组:

SELECT date_trunc('week', createdAt ) as start_of_week, sum(transactionTotal)
FROM <your_table_name_here>
GROUP BY date_trunc('week', createdAt )
ORDER BY date_trunc('week', createdAt )
选择日期(“周”,createdAt)作为周的开始,总和(transactionTotal)
从…起
按日期分组(“周”,创建日期)
按日期排序的订单(“周”,创建日期)

从Sequelize.js开始,您应该使用原始查询来执行此类SQL查询。

您可以创建一个CTE,该CTE生成一个名称和一个带有时区范围()的时间戳。然后将CTE连接到您的表中。最后,对属于特定范围的部分使用求和函数。参见示例

日期范围(范围名称、范围日期)为
(值('week_0',tstzrange((now()-间隔'6天'),now(),'[]))
,('week_1',tstzrange((now()-间隔'13天'),(now()-间隔'7天'),'[]))
,('week_2',tstzrange((now()-间隔'20天'),(now()-间隔'14天'),'[]))
,('week_3',tstzrange((now()-间隔'27天'),(now()-间隔'21天'),'[]))
) 
选择范围名称、范围日期、总和(金额)总金额
来自mytable mt
加入日期范围

在(mt.created_)上,您试图得到什么结果?您是否试图执行一些聚合?是的,如果是过去七天,我想要最后一天的总计(每天的总交易量)如果你明白我的意思@Jeremy,那就是七个月了,这有一些问题,首先我想从今天算起一周的总和,而不是星期一,其次我不需要,或者可能的
只有最后四天,
最后7天,
最后12天,还有一些日期似乎重复。提前向我的sql道歉知识是低的我指示简单的SQL查询。你可以很容易地添加WHERE子句,在其中你可以指示所需的日期范围,如
WHERE createdAt>=''
酷,我如何停止从周一开始的一周,并从你所在的任何一天开始思考你能展示一个你能实现的小例子吗?这实际上是有效的,一个小补丁gh,日期具有很高的时间戳精度,比如时区等等,你能帮我把它限制在
yyyy-mm-dd
吗?因为即使是在同一个日期,它也会切断一些记录,非常感谢我到目前为止所做的+1我在这里得到了它
with date_ranges (range_name, range_dates) as
     ( values ('week_0', tstzrange ((now()-interval '6 days'),  now(),'[]'))
            , ('week_1', tstzrange ((now()-interval '13 days'), (now()-interval '7 days'), '[]'))
            , ('week_2', tstzrange ((now()-interval '20 days'), (now()-interval '14 days'),'[]'))
            , ('week_3', tstzrange ((now()-interval '27 days'), (now()-interval '21 days'),'[]')) 
     ) 
select range_name, range_dates, sum(amount) total_amount 
  from mytable      mt
  join date_ranges  dr
    on (mt.created_at <@ range_dates)
 group by range_name, range_dates
 order by range_name;