午前1時から午前5時の間に作成された投稿のバッジ

残念ながら、これらのバッジに依存してしまいました :smiling_face_with_three_hearts:
このバッジは、午前1時から午前5時の間に投稿を作成したユーザーに付与され、毎日更新されます。
しかし残念ながら、その時間間隔を選択する方法がわかりません。ご協力をいただければ幸いです。

SELECT user_id, current_timestamp granted_at 
FROM badge_posts p  
WHERE p.created_at > CURRENT_DATE /* '1AM' と '5AM' の間でどのように指定すればよいですか? */ 
GROUP BY user_id 
HAVING count(*) >= 100

「いいね!」 3

以下のようにフィルタリングできます。

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

お役に立てれば幸いです。

「いいね!」 2

ご協力ありがとうございます。例を試してみましたが、プレビューではバッジが付与されません。今は11:17で、例の時間を10:00から13:00の間に変更し、デモのトピックと返信を作成しましたが、何も表示されません。以下も試してみました:

SELECT 
    user_id, 
    current_timestamp AS 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

それでも何も表示されません :thinking:

「いいね!」 1

データベースは GMT+0 でタイムスタンプを記録しているため、あなたのタイムゾーンとの時間差を考慮する必要があります。タイムゾーンを教えていただければ、調整いたします。

「いいね!」 3

素晴らしいです。ヨーロッパ/ブリュッセル、GMT +01:00 です。

「いいね!」 3

バッジが付与されていないのは、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
「いいね!」 3

余談ですが、素敵なバッジデザインですね。CSS でスタイリングされた SVG でしょうか、それともピクセルベースのグラフィックでしょうか?

「いいね!」 3

OMG、おっしゃる通りです!それを忘れていました。問題なく動作します。もし可能であれば、その時刻チェックをユーザーのプロフィールで設定した時間帯に基づいて行えないでしょうか?さもないと、ヨーロッパ以外の地域に住む方々のために、フォーラムが「ウォッチメン」バッジで溢れてしまいますね :smile:。本当にありがとうございます!

PhotoshopとFigmaで作成され、CSSスタイリングはされていません。デザインとすべてのバッジが完成次第、すぐにこのフォーラムにURLを投稿します。

「いいね!」 3

ユーザーのタイムゾーンを考慮すると、クエリは以下のようになります。

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
「いいね!」 5

本当にありがとうございます!:blush:

「いいね!」 1