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

如何在SQL Server中编写动态查询获取上月24日至本月23日的数据

动态获取上月24日至本月23日记录的SQL查询方案

嘿,我明白你想要的是一个不用手动改日期、也不用依赖Excel VBA的动态SQL查询,直接在SSMS里就能搞定上月24日到本月23日的记录对吧?我来给你一步步讲清楚怎么实现~

核心思路:动态计算日期范围

我们需要自动算出两个关键时间点:

  • 起始日期:上个月的24号
  • 结束日期:本月23号的次日(用来确保包含23号全天的所有记录,尤其是当day_id带时间部分时)

直接可用的SQL查询

写法一:直接在WHERE子句中计算日期

SELECT *
FROM 你的表名称
WHERE 
  -- 匹配大于等于上月24号的记录
  day_id >= DATEFROMPARTS(
    YEAR(DATEADD(MONTH, -1, GETDATE())), 
    MONTH(DATEADD(MONTH, -1, GETDATE())), 
    24
  )
  -- 匹配小于本月24号的记录(即包含本月23号全天)
  AND day_id < DATEADD(DAY, 1, DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 23));

写法二:先声明变量(更易读、方便调试)

如果觉得直接写在WHERE里太复杂,可以先把日期存进变量:

-- 声明起始日期:上月24号
DECLARE @StartDate DATE = DATEFROMPARTS(
  YEAR(DATEADD(MONTH, -1, GETDATE())), 
  MONTH(DATEADD(MONTH, -1, GETDATE())), 
  24
);

-- 声明结束日期:本月24号(用来包含本月23号全天)
DECLARE @EndDate DATE = DATEADD(DAY, 1, DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 23));

-- 查询目标范围的记录
SELECT *
FROM 你的表名称
WHERE day_id >= @StartDate AND day_id < @EndDate;

关键函数解释

  • GETDATE():获取当前系统的日期和时间
  • DATEADD(MONTH, -1, GETDATE()):得到当前日期往前推1个月的日期
  • YEAR()/MONTH():从日期中提取年份和月份
  • DATEFROMPARTS():用年、月、日三个数值直接构造标准日期,避免格式错误
  • DATEADD(DAY, 1, ...):把日期往后推1天,确保包含目标日期的所有时间(比如day_id是2024-05-23 18:30:00也能被匹配到)

为什么你之前的写法有问题?

你尝试用DATEPART匹配月份的方式,只能筛选出月份等于上个月的记录,会漏掉本月1号到23号的部分,所以无法覆盖完整的时间段。上面的写法不管是跨年(比如12月24号到1月23号)还是不同天数的月份(比如3月24号到4月23号),都能正确计算出目标范围。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:20:37