簡體   English   中英

確定一個時間戳是否與另一個時間戳相差 15 分鍾以內的最佳方法

[英]Best method to determine if one timestamp lies within 15 minutes of another

有兩個 Postgres 表,一個有計划時間的工作表,另一個有實際執行工作的時間。 所有時間都存儲為時間戳,表格以 1:1 的關系與工作編號相關聯。 圍繞工作時間有三個 KPI:

  • 工作在計划開始時間的 +/-15 分鍾內開始
  • 工作在計划結束時間的 +/-15 分鍾內完成
  • 開始和結束時間都在計划時間的 +/- 15 分鍾內

期望的結果是工作編號列表和每個 KPI 的通過/失敗字符串。 KPI 報告目前每月運行一次,但我們希望將其連接到實時儀表板。 目前的容量很低(6500 行/月),但一直在以每月 5-10% 左右的速度增長。

表_a

job_no rostered_start 名冊結束
836435 2022-11-01 07:00:00.000 2022-11-01 09:00:00.000
836436 2022-11-01 07:00:00.000 2022-11-01 10:00:00.000
836437 2022-11-01 08:15:00.000 2022-11-01 10:15:00.000

表_b

job_no 實際開始 實際結束
836435 2022-11-01 07:10:00.000 2022-11-01 09:10:00.000
836436 2022-11-01 08:53:00.000 2022-11-01 11:54:00.000
836437 2022-11-01 07:58:00.000 2022-11-01 09:58:00.000

結果

job_no kpi_start kpi_end kpi_startend
836435 經過 經過 兩者都通過
836436 失敗 失敗 都失敗了
836437 失敗 失敗 都失敗了

在沒有 abs(interval) 的情況下,目前我有兩個候選人來比較這兩個時間:

CASE
    WHEN ABS(TO_CHAR((table_a.rostered_start - table_b.actual_start) , 'MI')::integer) <= 15 
     THEN 'PASS'::TEXT
    ELSE 'FAIL'::TEXT
END AS start_time_check

要么

CASE
    WHEN table_b.actual_start <= (table_a.rostered_start + '00:15:00'::INTERVAL)
         AND table_b.actual_start >= (table_a.rostered_start - '00:15:00'::INTERVAL)
      THEN 'PASS'::TEXT
    ELSE 'FAIL'::TEXT
END AS start_time_check

在我工作的規模上,我選擇哪個似乎並不重要,但是:

  • 將其設置為功能矯枉過正,但“正確”的方法是這樣做嗎?
  • 有更好/更快/更有效的方法嗎?
SELECT *, kpi_start AND kpi_end AS kpi_startend
FROM  (
   SELECT job_no
        , b.actual_start - a.rostered_start BETWEEN interval '- 15 min' AND interval '15 min' AS kpi_start
        , b.actual_end   - a.rostered_end   BETWEEN interval '- 15 min' AND interval '15 min' AS kpi_end
   FROM   tbl_a a
   JOIN   tbl_b b USING (job_no)
   ) sub;

使用更自然的boolean值而不是通過/失敗。 易於翻譯。

interval數據類型沒有內置的abs()函數,只有abs(numeric_type) 但是BETWEEN... AND...結構至少具有同樣的性能並且足夠簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM