أخشى أنني أصبحت مدمنًا على هذه الشارات
ستُمنح هذه الشارة تحديدًا للمستخدمين الذين نشروا منشوراتًا بين الساعة 1 صباحًا و5 صباحًا، ويتم تحديثها يوميًا.
ولكن للأسف، لا أعرف كيفية تحديد هذا النطاق الزمني. أي مساعدة ستكون موضع تقدير.
SELECT user_id, current_timestamp granted_at
FROM badge_posts p
WHERE p.created_at > CURRENT_DATE /* كيف يمكن تحديد النطاق بين '1 صباحًا' و'5 صباحًا'؟ */
GROUP BY user_id
HAVING count(*) >= 100
SELECT
user_id,
current_timestamp granted_at
FROM badge_posts p
WHERE p.created_at::time BETWEEN '01:00' AND '05:00'
GROUP BY user_id
HAVING count(*) >= 100
شكرًا جزيلاً لمساعدتك. جربت مثالك، لكن لم يتم منح أي شارة في المعاينة. الآن الساعة 11:17 صباحًا هنا، وقمت بتغيير الوقت في مثالك بين 10:00 و13:00، وأنشأت موضوعًا تجريبيًا وردًا، لكن لا يظهر أي شيء. جربت أيضًا:
SELECT
user_id,
current_timestamp granted_at
FROM badge_posts p
WHERE p.created_at:: time >= '10:00:00' or p.created_at:: time < '13:00:00'
GROUP BY user_id
HAVING count(*) >= 100
تسجّل قاعدة البيانات الطابع الزمني بتوقيت غرينتش (GMT+0)، لذا يجب عليك إضافة فرق التوقيت هذا إلى منطقتك الزمنية. إذا أخبرتني بمنطقتك الزمنية، يمكنني تعديلها لك.
لا تتلقى الشارة لأنك أضفت قيد HAVING count(*) >= 100، وبالتالي لن تتمكن من كسب الشارة إلا إذا نشرت أكثر من 100 منشور خلال تلك الفترة الزمنية.
SELECT
user_id,
current_timestamp granted_at
FROM badge_posts p
WHERE p.created_at::time BETWEEN '02:00' AND '06:00'
GROUP BY user_id
HAVING count(*) >= 100
يا إلهي، أنت محق، لقد نسيت ذلك. إنه يعمل. إذا لم أطلب الكثير، هل من الممكن أن يكون فحص الوقت بناءً على الوقت الذي اختاره المستخدم في ملفه الشخصي؟ بخلاف ذلك، سيكون المنتدى مليئًا بشارات “المراقبين” (لأولئك الذين يعيشون خارج أوروبا وما إلى ذلك). شكرًا جزيلاً!
مع مراعاة المنطقة الزمنية للمستخدم، سيبدو الاستعلام كالتالي:
WITH users_timezone AS (
SELECT
user_id,
CASE WHEN utc_offset IS NULL THEN '00:00:00'
ELSE utc_offset END
FROM user_options uo
LEFT JOIN pg_timezone_names pt ON uo.timezone = pt.name
)
SELECT
p.user_id,
current_timestamp granted_at
FROM badge_posts p
INNER JOIN users_timezone ut ON ut.user_id = p.user_id
WHERE (p.created_at+ut.utc_offset)::time BETWEEN '01:00' AND '05:00'
GROUP BY p.user_id
HAVING count(*) >= 100