SQLSERVER

WITH a as (

SELECT 1 id,'2024-09-13 09:00:00' tm

UNION

SELECT 2 id,'2024-09-13 12:05:00' tm

UNION

SELECT 3 id,'2024-09-13 13:50:00' tm

UNION

SELECT 4 id,'2024-09-13 14:15:00' tm

UNION

SELECT 5 id,'2024-09-13 14:20:00' tm

UNION

SELECT 5 id,'2024-09-13 18:45:00' tm

)

SELECT  

    id,  

    tm,  

    -- 使用LAG函数获取上一行的时间戳  

    -- 计算时间差  

   DATEDIFF(MINUTE, LAG(tm) OVER (ORDER BY id), tm) AS Time

FROM  

    a

----------------------------

假设上面这样的字段,上一个时间12:05与下个时间13:50  中间 是12:40-13:40 是休息时间,想要T除这部分时间。

SQL CCn1234 发布于 6 天前
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共1回答
最佳回答
0
很困想睡觉Lv5初级互助
发布于6 天前

WITH a AS (      SELECT 1 AS id, CAST('2024-09-13 09:00:00' AS DATETIME) AS tm      UNION ALL      SELECT 2, CAST('2024-09-13 12:05:00' AS DATETIME)      UNION ALL      SELECT 3, CAST('2024-09-13 13:50:00' AS DATETIME)      UNION ALL      SELECT 4, CAST('2024-09-13 14:15:00' AS DATETIME)      UNION ALL      SELECT 5, CAST('2024-09-13 14:20:00' AS DATETIME)      UNION ALL      SELECT 6, CAST('2024-09-13 18:45:00' AS DATETIME)   ),   b AS (      SELECT          id,          tm,          LAG(tm) OVER (ORDER BY id) AS prev_tm      FROM          a   ),   c AS (      SELECT          id,          tm,          prev_tm,          CASE              WHEN CAST(prev_tm AS TIME) <= '12:40:00' AND CAST(tm AS TIME) >= '13:40:00' THEN                  DATEDIFF(MINUTE, CAST(prev_tm AS DATETIME), CAST('13:40:00' AS DATETIME))                  + DATEDIFF(MINUTE, CAST('14:00:00' AS DATETIME), tm)              WHEN CAST(prev_tm AS TIME) > '12:40:00' AND CAST(prev_tm AS TIME) < '13:40:00' THEN                  DATEDIFF(MINUTE, CAST('14:00:00' AS DATETIME), tm)              ELSE                  DATEDIFF(MINUTE, prev_tm, tm)          END AS adjusted_time_diff      FROM          b   )   SELECT      id,      tm,      prev_tm,      adjusted_time_diff   FROM      c   ORDER BY      id;

  • 2关注人数
  • 63浏览人数
  • 最后回答于:6 天前
    请选择关闭问题的原因
    确定 取消
    返回顶部