إضافة بارامتر تاريخ

غالبًا ما ترغب في استخراج البيانات لفترة زمنية محددة. يمكنك القيام بذلك عن طريق ترميز الفترة الزمنية الخاصة بك في الاستعلام نفسه، ولكن لجعل تقريرك أكثر مقاومة للتغييرات المستقبلية، يمكنك إضافة معلمة تاريخ:

تم تصميم هذا الاستعلام لحساب العدد الإجمالي للمشاركات في كل فئة (باستثناء المشاركات والمواضيع المحذوفة، والرسائل الخاصة، والمواضيع التي لا تحتوي على فئة) التي تم إنشاؤها ضمن نطاق تاريخ محدد، ثم ترتيب الفئات حسب العدد الإجمالي للمشاركات بترتيب تنازلي.

-- [params]
-- date :start_date -- This is a parameter for the start date of the range
-- date :end_date -- This is a parameter for the end date of the range

SELECT
   t.category_id,
   COUNT(p.id) AS "Total Posts" -- Count the number of posts in each category
FROM posts p
  JOIN topics t ON t.id = p.topic_id
WHERE p.created_at::date BETWEEN :start_date AND :end_date -- Filter posts that were created between the start date and the end date (::date casts the created_at timestamp as a date)
  AND t.deleted_at IS NULL
  AND p.deleted_at IS NULL
  AND t.archetype <> 'private message'
  AND p.user_id > 0
  AND t.category_id IS NOT NULL
GROUP BY 1
ORDER BY 2 DESC

يجعل استخدام نمط المعلمة date بدلاً من string إدخال قيمة المعلمة أكثر سهولة، خاصة عند مشاركتها مع الآخرين.

نصيحة أخرى جديرة بالملاحظة لهذا النوع من الاستعلامات هي تحويل created_at إلى تاريخ. نظرًا لأن القيمة مخزنة في قاعدة البيانات كطابع زمني، إذا لم تقم بتحويلها إلى تاريخ، فلن يلتقط الاستعلام النتائج من تاريخ :end_date نفسه.

يمكنك التحقق من القيم المخزنة كطوابع زمنية باستخدام شجرة المستكشف:

هذا الاستعلام هو في الغالب مثال لتوضيح المبادئ. نأمل أن تجده مفيدًا، ولكن إذا كانت لديك أي أسئلة، فيرجى طرحها أدناه. :slight_smile:

9 إعجابات
PG::SyntaxError: ERROR:  syntax error at or near :
LINE 16: WHERE p.created_at::date BETWEEN :start_date AND :end_date -…

:tired_face:

4 إعجابات

نعم، لا يعجبها تلك التعليقات المضمنة بجانب المعلمات.

-- [params]
-- date :start_date 
-- date :end_date 

SELECT
   t.category_id,
   COUNT(p.id) AS "إجمالي المشاركات" -- احسب عدد المشاركات في كل فئة
FROM posts p 
  JOIN topics t ON t.id = p.topic_id 
WHERE p.created_at::date BETWEEN :start_date AND :end_date -- قم بتصفية المشاركات التي تم إنشاؤها بين تاريخ البدء وتاريخ الانتهاء (::date تحول الطابع الزمني لـ created_at إلى تاريخ)
  AND t.deleted_at IS NULL 
  AND p.deleted_at IS NULL 
  AND t.archetype <> 'private message' 
  AND p.user_id > 0
  AND t.category_id IS NOT NULL 
GROUP BY 1 
ORDER BY 2 DESC

يبدو أن هذا يعمل بشكل أفضل. :+1: (قد تحتاج إلى تحديث الصفحة في المرة الأولى لالتقاط مربعات إدخال المعلمات)

شكرًا لمساعدتك في تصحيح الأخطاء في الأدلة. :slight_smile: :trophy:

7 إعجابات