You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 07:24:22