Posted by: siamnobita | 12/29/2009

Function to count weekend (2)

ต่อจากตัวอย่างที่แล้ว ยังสนุกไม่เลิก รู้สึกว่า logic ของตัวอย่างที่แล้วมันเข้าใจยากเกินไปหน่อย เลยพยายามหา logic อื่น ผลลัพธ์คือ query นี้ครับ

select d1, d2
  , trunc(((d2-d1)+1)/7)*2
  + case
      when to_char(d1,’d’) = ‘1’ and to_char(d2,’d’) = ‘7’ then 0
      when to_char(d1,’d’) = ‘1’ then 1
      when to_char(d2,’d’) = ‘7’ then 1
      when to_char(d2,’d’) < to_char(d1,’d’) then 2
      else 0
    end cnt
from weekend_count

สำหรับ query นี้มาจากการสังเกตตาราง

    1 2 3 4 5 6 7
    อา พฤ
1 อา 1 1 1 1 1 1 0
2 2 0 0 0 0 0 1
3 2 2 0 0 0 0 1
4 2 2 2 0 0 0 1
5 พฤ 2 2 2 2 0 0 1
6 2 2 2 2 2 0 1
7 2 2 2 2 2 2 1

แนวนอนเป็นวันที่เริ่มต้นว่าตรงกับวันอะไร ส่วนแนวตั้งเป็นวันที่สุดท้าย
ส่วนค่าแต่ละค่ามาจากการนับ เช่น จากวันอาทิตย์ ถึง วันศุกร์ มีวันหยุด 1 วัน
จากวันอังคาร ถึงวันจันทร์ จะมีวันหยุด 2 วัน

ซึ่งผมสรุปได้ เป็นกรณีดังนี้
1.วันแรกเป็นวันอาทิตย์ และวันสุดท้ายเป็นวันเสาร์ ครบสัปดาห์พอดี ไม่ต้องบวกเพิ่ม
2.วันแรกเป็นวันอาทิตย์ หรือวันสุดท้ายเป็นวันเสาร์ มีวันหยุด 1 วัน
3.วันสุดท้ายเป็นวันในสัปดาห์ที่อยู่ก่อนวันแรก แสดงว่าผ่านเสาร์อาทิตย์มาหนึ่งรอบ บวกเพิ่มอีก 2
4.นอกจากกรณีข้างต้น แสดงว่าไม่มีวันหยุดเลย

ซึ่งสามารถเขียนเป็น sql โดยใช้ case expression ได้ดังตัวอย่าง

ถ้าเปรียบเทียบ query นี้ กับ query ก่อน ผมไม่แน่ใจนักว่าอันไหนจะเร็วกว่า แต่คิดว่าอันหลังน่าจะเร็วกว่า เพราะมีการคำนวณน้อยกว่า แต่คิดว่าก็คงต่างกันไม่มากนัก หากจะเลือกใช้ น่าจะเลือกจาก logic มากกว่า โดยดูว่าอันไหนเข้าใจง่ายกว่ากัน

SQL is fun!!!!


ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s

หมวดหมู่

%d bloggers like this: