मेरा सुझाव है कि created_at
. के बीच व्यावसायिक घंटों की सभी श्रेणियां जेनरेट करें और current_timestamp और उनका सारांश। हालांकि यह प्रदर्शन के मामले में इष्टतम समाधान से बहुत दूर है, मुझे लगता है कि यह सबसे सीधा-आगे दृष्टिकोण है। मैं टाइम ज़ोन रेंज के साथ टाइमस्टैम्प का उपयोग करता हूं tstzrange
चौराहे के साथ ऑपरेटर (*)
।
SELECT id,
created_at,
SUM(upper(business_range) - lower(business_range) ) business_hours
FROM (
SELECT id,
created_at,
tstzrange(date_in_range + '09:00'::time with time zone, date_in_range + '17:00'::time with time zone)
* tstzrange(created_at, current_timestamp) as business_range
FROM (
SELECT id,
created_at,
created_at::date + generate_series(0, current_timestamp::date - created_at::date) as date_in_range
FROM times
) dates_in_range
WHERE date_part('dow', date_in_range) in (1,2,3,4,5)
) business_hour_ranges
GROUP BY
id,
created_at
सेटअप और उदाहरण देखें db<>fiddle
सावधानी बरतने के लिए
जबकि कार्यान्वयन को समझने और डीबग करने में आसान बनाया गया था, इसके परिणामस्वरूप खराब प्रदर्शन हो सकता है - खासकर अगर बहुत पुरानी बनाई गई तारीखों के साथ उपयोग किया जाता है। यदि आपके सिस्टम में ऐसा हो सकता है, तो आप बेहतर लेखन कार्य कर सकते हैं जो create_at और current_date के सप्ताह के दिन की जांच करता है, उनके बीच दिनों की संख्या ढूंढता है और काम के घंटे निर्धारित करता है।