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

SQL Server:如何从另一张表获取指定日期前后各2个时间戳

解决方案

假设两张表的结构如下(可根据实际业务调整列名):

  • Table1:存储待筛选的时间戳数据,核心列如event_timestamp(datetime类型)
  • Table2:存储指定的目标日期,核心列如target_date(datetime类型,即你提到的粉色高亮内容)

可以通过关联表+窗口函数+子查询实现需求,全程无需CTE,兼容Tableau:

-- 筛选目标日期之前的最近2个时间戳
SELECT t1.event_timestamp, t2.target_date
FROM (
    SELECT 
        t1.event_timestamp,
        t2.target_date,
        ROW_NUMBER() OVER (PARTITION BY t2.target_date ORDER BY t1.event_timestamp DESC) AS rn_before
    FROM Table1 t1
    JOIN Table2 t2 ON t1.event_timestamp <= t2.target_date
) sub_before
WHERE rn_before <= 2

UNION ALL

-- 筛选目标日期之后的最近2个时间戳
SELECT t1.event_timestamp, t2.target_date
FROM (
    SELECT 
        t1.event_timestamp,
        t2.target_date,
        ROW_NUMBER() OVER (PARTITION BY t2.target_date ORDER BY t1.event_timestamp ASC) AS rn_after
    FROM Table1 t1
    JOIN Table2 t2 ON t1.event_timestamp >= t2.target_date
) sub_after
WHERE rn_after <= 2

-- 可选:若需去重(比如目标日期恰好等于某个时间戳,会在前后结果中重复出现)
ORDER BY target_date, event_timestamp;

关键说明

  • 用UNION ALL拆分“取前2个”和“取后2个”的逻辑,避免CTE嵌套
  • PARTITION BY t2.target_date确保每个目标日期独立计算对应的前后时间戳顺序
  • ROW_NUMBER()用来给每个目标日期关联的时间戳排序,精准筛选出最近的2条
  • 如果Table2的target_date是纯日期类型(不带时分秒),可通过CAST(t2.target_date AS datetime)转换后再关联,保证时间匹配逻辑准确

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:55:21