[英]How to determine if one timestamp precedes another in postgresql?
[英]Best method to determine if one timestamp lies within 15 minutes of another
有兩個 Postgres 表,一個有計划時間的工作表,另一個有實際執行工作的時間。 所有時間都存儲為時間戳,表格以 1:1 的關系與工作編號相關聯。 圍繞工作時間有三個 KPI:
期望的結果是工作編號列表和每個 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.