@ फ्रैंक की टिप्पणी से प्रेरित होकर मैंने कुछ परीक्षण किए और उसी के अनुसार अपनी क्वेरी को अनुकूलित किया। यह 1) सही होना चाहिए और 2) जितनी जल्दी हो सके:
SELECT u.login, u.id, u.first_name
FROM pref_users u
WHERE u.login > u.logout
AND u.login >= now()::date + interval '1h'
ORDER BY u.login;
चूंकि आपकी तालिका में भविष्य का कोई टाइमस्टैम्प नहीं है (मुझे लगता है), आपको किसी ऊपरी सीमा की आवश्यकता नहीं है।date_trunc('day', now()) लगभग now()::date as जैसा ही है (या नीचे दिए गए कुछ अन्य विकल्प), केवल यह कि यह timestamp लौटाता है date . के बजाय . दोनों का परिणाम timestamp होता है वैसे भी interval adding जोड़ने के बाद ।
नीचे के भाव थोड़ा अलग तरीके से प्रदर्शन करते हैं। वे सूक्ष्म रूप से भिन्न परिणाम देते हैं क्योंकि localtimestamp डेटा प्रकार देता है timestamp जबकि now() रिटर्न timestamp with time zone . लेकिन जब date पर कास्ट किया जाता है , या तो उसी स्थानीय . में बदल दिया जाता है दिनांक, और एक timestamp [without time zone] स्थानीय समय क्षेत्र में भी माना जाता है। तो जब संबंधित timestamp with time zone . से तुलना की जाती है वे सभी आंतरिक रूप से समान UTC टाइमस्टैम्प में परिणामित होते हैं। इस संबंधित प्रश्न में समय क्षेत्र प्रबंधन के बारे में अधिक जानकारी।
बेस्ट ऑफ फाइव। PostgreSQL 9.0 के साथ परीक्षण किया गया। 9.1.5 के साथ दोहराया गया:1% त्रुटि मार्जिन के भीतर लगातार परिणाम।
SELECT localtimestamp::date + interval '1h' -- Total runtime: 351.688 ms
, current_date + interval '1h' -- Total runtime: 338.975 ms
, date_trunc('day', now()) + interval '1h' -- Total runtime: 333.032 ms
, now()::date + interval '1h' -- Total runtime: 278.269 ms
FROM generate_series (1, 100000)
now()::date स्पष्ट रूप से CURRENT_DATE से थोड़ा तेज है ।