簡體   English   中英

列日期之間的天數

[英]Days between column dates

我在 PostgreSQL 中有以下列:日期

有沒有辦法在不創建任何新表的情況下獲取這兩個列之間的天數,不包括周末和特定的假期列表? 我看到使用 generate_series 可能是可能的,但我找不到最好的方法。

您要求的確切查詢有點不清楚,因為您沒有告訴我們是否應該建立包括第一天在內的天數,例如對於 date_created = 的情況,金額應該是 1 還是 0日期更新。 由於通常還會計算第一天,因此我在此查詢中假設這是確定工作日的數量:

SELECT date_created, date_updated, 
SUM (CASE WHEN EXTRACT (dow FROM dt) BETWEEN 1 AND 5 THEN 1 ELSE 0 END) AS workingDays
FROM (SELECT date_created, date_updated, 
GENERATE_SERIES (date_created, date_updated, '1 day'::INTERVAL) AS dt
FROM yourtable) t
GROUP BY date_created, date_updated
ORDER BY date_created;

這個想法是建立一個 date_created 和 date_updated 之間所有天的列表,然后只計算第 1 天到第 5 天,因為周末是一周的第 6 天和第 7 天。 為了也排除假期,我認為您將需要一個不應計算的日期列表。 假期因地區而異,其中許多假期每年都不同,這意味着它們每年都不在同一日期。 因此,我認為除了提供不應計算的天數之外別無他法。 所以你可以像這樣擴展第一個查詢:

SELECT date_created, date_updated, 
SUM(CASE WHEN EXTRACT (dow FROM dt) BETWEEN 1 AND 5 THEN 1 ELSE 0 END) 
-SUM(CASE WHEN dt IN (date1,date2,...) THEN 1 ELSE 0 END) AS workingDays
FROM (SELECT date_created, date_updated, 
GENERATE_SERIES(date_created, date_updated, '1 day'::INTERVAL) AS dt
FROM yourtable) t
GROUP BY date_created, date_updated
ORDER BY date_created;

例如:

SELECT date_created, date_updated, 
SUM(CASE WHEN EXTRACT (dow FROM dt) BETWEEN 1 AND 5 THEN 1 ELSE 0 END) 
-SUM(CASE WHEN dt IN ('2021-01-01','2020-01-01') THEN 1 ELSE 0 END) AS workingDays
FROM (SELECT date_created, date_updated, 
GENERATE_SERIES(date_created, date_updated, '1 day'::INTERVAL) AS dt
FROM yourtable) t
GROUP BY date_created, date_updated
ORDER BY date_created;

如果您不想計算第一天(因此 date_created = date_updated 的天數應為 0),只需編寫

... - 1 AS workingDays...

這里的工作示例: db<>fiddle

暫無
暫無

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

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