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

如何用SQL提取上一自然周数据?现有查询语句失效求助

解决SQL提取上一自然周数据的问题

直接通过周数字段对比容易出现跨年匹配错误,更可靠的方式是计算上一自然周的具体日期范围,再用这个范围过滤数据。以下分两种周范围给出解决方案:

情况1:上一自然周为「周一至周日」

先计算上周一和上周日的精确日期,再筛选对应区间的记录:

-- 先设置周起始为周一(避免服务器默认设置影响计算)
SET DATEFIRST 1;

-- 计算上周一的日期
DECLARE @LastMonday DATE = DATEADD(DAY, -DATEPART(WEEKDAY, GETDATE()) - 6, GETDATE());
-- 计算上周日的日期(上周一加6天)
DECLARE @LastSunday DATE = DATEADD(DAY, 6, @LastMonday);

-- 筛选上一自然周的数据
SELECT 
    DATEPART(WEEK, DateTimePrinted) AS 'week number',
    DATENAME(WW, GETDATE()) AS 'This week'
FROM YourTableName
WHERE DateTimePrinted >= @LastMonday 
  AND DateTimePrinted < DATEADD(DAY, 1, @LastSunday);
-- 用<下周一的写法,能包含周日当天的所有时间数据,无需额外处理时分秒

情况2:上一自然周为「周日至周六」

同理,先计算上周日和上周六的日期:

-- 设置周起始为周日
SET DATEFIRST 7;

-- 计算上周日的日期
DECLARE @LastSunday DATE = DATEADD(DAY, -DATEPART(WEEKDAY, GETDATE()), GETDATE());
-- 计算上周六的日期(上周日加6天)
DECLARE @LastSaturday DATE = DATEADD(DAY, 6, @LastSunday);

-- 筛选上一自然周的数据
SELECT 
    DATEPART(WEEK, DateTimePrinted) AS 'week number',
    DATENAME(WW, GETDATE()) AS 'This week'
FROM YourTableName
WHERE DateTimePrinted >= @LastSunday 
  AND DateTimePrinted < DATEADD(DAY, 1, @LastSaturday);

原方法无效的原因

  1. getdate(-1)是错误写法,正确获取前一天日期的语法是DATEADD(DAY, -1, GETDATE());
  2. 仅通过周数对比存在跨年风险:比如2023年最后一周和2024年第一周的周数可能重复,导致筛选出错误年份的数据;
  3. 日期范围过滤能精准锁定上一自然周的所有记录,避免周数匹配的歧义。

内容的提问来源于stack exchange,提问作者Robin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 23:03:24