Node.js/PostgreSQL实现上周指定日期及13周前日期查询
在Node.js或PostgreSQL中获取指定周范围日期
Node.js 实现方案
原生JavaScript(无需依赖库)
直接通过Date对象的方法计算,无需额外安装包:
获取上周日
function getLastSunday() { const today = new Date(); const dayOfWeek = today.getDay(); // 返回0(周日)到6(周六) // 计算需要往前推的天数:周日推7天,其他日期推对应星期数的天数 const daysToSubtract = dayOfWeek === 0 ? 7 : dayOfWeek; const lastSunday = new Date(today); lastSunday.setDate(today.getDate() - daysToSubtract); // 重置时间为0点,避免时间部分干扰查询 lastSunday.setHours(0, 0, 0, 0); return lastSunday; } // 示例:输出格式化后的日期 console.log(getLastSunday().toISOString().split('T')[0]); // 格式:YYYY-MM-DD
获取13周前的周日(日期范围起始点)
基于上周日的结果,往前推13周(91天)即可:
function get13WeeksAgoSunday() { const lastSunday = getLastSunday(); const thirteenWeeksAgo = new Date(lastSunday); thirteenWeeksAgo.setDate(lastSunday.getDate() - 13 * 7); thirteenWeeksAgo.setHours(0, 0, 0, 0); return thirteenWeeksAgo; } // 示例:输出日期范围 const start = get13WeeksAgoSunday(); const end = getLastSunday(); console.log(`日期范围:${start.toISOString().split('T')[0]} 至 ${end.toISOString().split('T')[0]}`);
使用Day.js库(轻量日期工具)
Day.js语法更简洁,适合复杂日期操作,先安装依赖:
npm install dayjs
代码实现
const dayjs = require('dayjs'); // 配置周日为一周的起始(默认周一为起始) dayjs.locale('en', { weekStart: 0 }); // 获取上周日 const lastSunday = dayjs().startOf('week').subtract(1, 'week'); // 获取13周前的周日 const thirteenWeeksAgoSunday = lastSunday.subtract(12, 'week'); // 输出格式化后的日期 console.log('上周日:', lastSunday.format('YYYY-MM-DD')); console.log('13周前的周日:', thirteenWeeksAgoSunday.format('YYYY-MM-DD'));
PostgreSQL 实现方案
利用PostgreSQL原生日期函数直接计算,无需额外工具:
获取上周日
SELECT current_date - CASE WHEN extract(dow from current_date) = 0 THEN 7 ELSE extract(dow from current_date)::int END AS last_sunday;
extract(dow from current_date)返回0(周日)到6(周六),通过CASE分支处理周日的特殊情况,确保得到的是上周的周日。
获取13周前的周日
基于上周日的结果,往前推13周即可:
SELECT (current_date - CASE WHEN extract(dow from current_date) = 0 THEN 7 ELSE extract(dow from current_date)::int END) - interval '13 weeks' AS thirteen_weeks_ago_sunday;
查询日期范围内的数据
将日期范围应用到数据查询中,比如查询your_table中created_at在13周前周日到上周日之间的记录:
WITH date_range AS ( SELECT current_date - CASE WHEN extract(dow from current_date) = 0 THEN 7 ELSE extract(dow from current_date)::int END AS last_sunday, (current_date - CASE WHEN extract(dow from current_date) = 0 THEN 7 ELSE extract(dow from current_date)::int END) - interval '13 weeks' AS start_date ) SELECT * FROM your_table, date_range WHERE created_at BETWEEN start_date AND last_sunday;
内容的提问来源于stack exchange,提问作者Muhamad Fadhil Surya Putra
相关产品推荐
相关产品推荐

