मेरे पास घटनाओं की एक तालिका है, प्रत्येक पंक्ति में एक शून्य timestamptz कॉलम है। कुछ मूल्य अतीत में हैं, अन्य भविष्य में हैं।

मैं जो चाहता हूं वह एक प्रश्न है जो "जल्द से जल्द" घटना द्वारा आदेशित घटनाओं की एक सूची लौटाएगा, जिसमें अतीत की घटनाओं को सूची के नीचे क्रमबद्ध किया जाएगा।

तो उदाहरण के लिए, यदि तालिका में निम्न मान हैं:

A  2021-06-25T00:00:00-05:00
B  2021-06-28T00:00:00-05:00
C  2021-06-30T00:00:00-05:00
D  2022-08-01T00:00:00-05:00
E  2021-07-01T00:00:00-05:00

और NOW() 2021-06-29T00:00:00-05:00 का समय,

मैं सूची के रूप में आदेश दिया चाहता हूँ:

C  2021-06-30T00:00:00-05:00
E  2021-07-01T00:00:00-05:00
D  2022-08-01T00:00:00-05:00
B  2021-06-28T00:00:00-05:00
A  2021-06-25T00:00:00-05:00
0
Andrew D 30 जून 2021, 09:22

2 जवाब

तो मैंने आगे बढ़कर यह किया है:

ORDER BY CASE
             WHEN (event.event_date < NOW()) THEN (event.event_date + make_interval(50) - NOW())
             ELSE event.event_date - NOW() END ASC

मैं इसे प्यार नहीं करता। लेकिन यह वैसे भी वांछित व्यवहार का अनुमान लगाता है, उसमें भविष्य की घटनाओं को जल्द से जल्द आदेश दिया जाता है, और पिछली घटनाएं अंत में होती हैं। make_interval(50) अतीत की घटनाओं में 50 साल जोड़ता है। यह एक मनमाना संख्या है लेकिन यह तब तक काम करती है जब तक कि कुछ बेहतर न हो जाए।

0
Andrew D 30 जून 2021, 06:44

विचार यह है कि पहले उन्हें भविष्य या अतीत के आधार पर छाँटें, और फिर उस तिथि के अनुसार क्रमबद्ध करें जो वर्तमान तिथि के सबसे करीब है।

आप पंक्तियों को समूहों में रखने के रूप में पहली ऑर्डरिंग अभिव्यक्ति के बारे में सोच सकते हैं। फिर दूसरी ऑर्डरिंग अभिव्यक्ति प्रत्येक समूह के भीतर पंक्तियों का आदेश देगी। (ग्रुप बाय का उपयोग करके वास्तविक समूहों के साथ भ्रमित होने की नहीं।)

आप अपनी दूसरी ऑर्डरिंग अभिव्यक्ति को उस तिथि और वर्तमान तिथि के बीच के अंतर के निरपेक्ष मान के रूप में भी सोच सकते हैं।

मैंने वर्णन करने के लिए एक अस्थायी तालिका बनाई है:

BEGIN;

CREATE TEMPORARY TABLE timestamps (
    id uuid NOT NULL PRIMARY KEY DEFAULT uuid_generate_v4(),
    value timestamptz
) 
ON COMMIT DROP;

INSERT INTO timestamps
    (value)
VALUES
    (NOW() + INTERVAL '1 week'),
    (NOW() - INTERVAL '1 week'),
    (NOW() + INTERVAL '2 weeks'),
    (NOW() - INTERVAL '2 weeks'),
    (NOw() + INTERVAL '3 weeks'),
    (NOW() - INTERVAL '3 weeks');

SELECT
    id, value
FROM timestamps
ORDER BY
  NOW() < value DESC,
  GREATEST(
    value - NOW(),
    NOW() - value
  );

COMMIT;
2
derefed 30 जून 2021, 06:53