Tag Archive WITH

Byphunsanit

SQL Server: recursive หาวันเสาร์ทุก ๆ วันจนถึงวันนี้

จากเรื่องที่แล้ว Mariadb: recursive หาวันเสาร์ทุก ๆ วันจนถึงวันนี้ ก็คิดได้ว่า วิธีที่หาวันเสาร์ทุก ๆ วันแบบนี้มันก็เขียนกับ SQL Server ได้นี่น่า แต่เปลี่ยนเป็น CTE

WITH DateSeries AS (
    SELECT CAST('2010-01-01' AS DATE) AS dt
    UNION ALL
    SELECT DATEADD(day, 1, dt)
    FROM DateSeries
    WHERE dt <= GETDATE()
)
SELECT dt
FROM DateSeries
WHERE DATEPART(weekday, dt) = 7
ORDER BY dt
OPTION (maxrecursion 0);

อธิบาย

  • บรรทัด 1 – 7 มันเหมือนกับการเขียน program recursive function ที่จะเรียกตัวเองไปเรื่อย ๆ ตั้งแต่วันที่ 1 มกราคม 2010 จนหยุดเมื่อวันที่น้อยกว่าหรือเท่ากับปัจจุบัน ไว้ ใน temporary result DateSeries
  • เอามา select ซ้ำอีกรอบ ตรงนี้ query ที่จะใช้จริง ๆ อาจจะต้องเอามาดัดแปลงอีกทีตามตารางที่เราเก็บข้อมูล จะ left join, right join, union join ก็แล้วแต่ความต้องการใช้
  • บรรทัด 10 คือเงื่อนไขวันที่เราต้องการค้นหา
  • บรรทัด 12 OPTION (maxrecursion 0); ใส่เพราะว่ามีการเรียกตัวเอง ( recursive ) มากกว่า 100 ครั้ง ทำให้มี error
    The maximum recursion 100 has been exhausted before statement completion

อ่านเพิ่มเติม