Programing

TDD VB.NET ตอน ถามหาคนอนุมัติ

จากหน้าตาของคลาส PurchaseRequest เมื่อวาน มันมี Metod นึงชื่อ GetApprovalPerson เพื่อที่จะระบุไปว่า ใครควรจะต้องเป็นผู้อนุมัติการขอสั่งซื้ออันนี้

ตาม Requirement นั้นมันจะมีเงื่อนไขเบื้องต้นดังนี้

ถ้ายอดเงินรวมไม่เกิน 50,000 บาท ให้ระดับ Manager เป็นผู้อนุมัติ P/R
ถ้ายอดเงินไม่เกิน 80,000 บาท  ให้ระดับ Senior Manager เป็นผู้อนุมัติ P/R
ถ้ายอดเงินไม่เกิน 350,000 บาท ให้ระดับ General Manager เป็นผู้อนุมัติ P/R
ถ้ามากกว่านั้น ให้ President เป็นผู้อนุมัติ P/R

ก่อนอื่นเราก็มาเขียน Test ก่อน

pic6

อันนี้คือภาพสุดท้ายของ Test นี้นะครับ จริงๆ แล้วถ้าจะให้ทำตามลำดับก็คือ

พอเขียนบรรทัด  Dim pr  As New PurchasRequest(ItemName, prAmount)  เจ้า IDE มันก็จะฟ้องว่าไม่รู้จัก PruchaseRequest เราก็ค่อยไปเขียน Class PurchaseRequest พร้อม Constructor หน้าตาตามที่ระบุไว้

จะเห็นว่าผมใส่ TestCase ไปซะ 8 เคส ตาม Boundary Value Analysis  จากนั้นก็ไปเขียน Code กัน

pic7

พอ Code เสร็จเราก็ไปดูหน่อยว่าผลลัพธ์ที่ได้จากการ test เป็นเยี่ยงใด

pic8

เห็นเขียวหมดแบบนี้ก็นอนหลับฝันดีได้ครับ …

Programing

VB.NET ตอน หาผลรวมของ item

Microsoft ไม่ได้ใช้ชื่อ  VB.NET มาตั้งนานแล้วนะครับ เหลือแต่แค่ VB เฉยๆ เนี่ยแหล่ะ แต่ด้วยความคุ้นชิน ผมก็ยังใช้ vb.net อยู่แหล่ะนะ

วันนี้ตัดส่วนนึงของตอนยาวๆ มาเล่าให้ฟังกันก่อน

ผมมี Class นึงชื่อ PurchaseRequest  ซึ่งเป็นข้อมูลของเอกสารใบขอซื้อ (Purchasing Request หรือ ที่บริษัทผมเขาเรียกว่า P/R) ใน P/R แต่ละใบก็จะมีรายการสั่งซื้อหลายรายการในแต่ละรายการผมจะเรียกมันว่า PRItem มีคลาสที่ชื่อว่า PurchaseRequestItem

ประเด็นวันนี้ง่ายๆ คือผมต้องการรวมราคาซื้อ (Amount) ของทุก Item เป็น Total Amount เพื่อที่จะเอาไปทำอะไรบางอย่างหลังจากนั้น 

มาดูหน้าตากันหน่อย

pic3

pic4

จะเห็นว่าผมมี prItems ที่เป็น List ของ PurchaseRequestItem

และผมต้องการเอา Amount ของแต่ละ item ที่อยู่ใน List มา Sum หาผลรวม …. จะทำยังไงดี 

…. Extension Method … กับ Lamda expression ไงครับ

พอเปลี่ยนมาเขียนด้วย vb.net มันก็มีหน้าตาต่างกับ C# ที่เขียนไปเมื่อหลายวันก่อนนิดหน่อย

Dim TotalPRAmount As Decimal = prItems.Sum(Function(pritem) pritem.Amount)

สั้นๆ ง่ายๆ บรรทัดเดียวนี่แหล่ะ

Programing

LINQ Mono C# กับการ Union

อันนี้อยู่ในหนังสือ Pro C# 5.0 แหล่ะครับ อ่านแล้วก็มีประเด็นเรื่องฝรั่งพิมพ์เกิน …. แต่แค่นิดหน่อย น่าจะเป็นเพราะพิมพ์เพลินมากกว่า เนื้อหาสาระยังถูกต้อง

แต่ตอนนี้ผมไม่มี windows อยู่กับตัวก็เลยไปเขียนบน Online web ที่เขาใช้ Mono 2.0 ละกันนะครับ

ใน Enumerable Class นั้นมี extension method เยอะแยะเลยที่เขาเตรียมมาให้เราได้ใช้ในการหา Unions , Intersections , Differences ของ 2 LINQ Queries (หรือมากกว่านั้น)

อันนี้เป็นตัวอย่างในหนังสือแต่ผมเอาไปเขียนบน Mono แทน

ตัวอย่างแรก เราก็ไปดู extension method ที่ชื่อว่า .Except ซึ่งจะ return Item ที่มีอยู่ใน LINQ Query แรกแต่ไม่มีในอันที่สอง (Differences) เราจะได้ผลลัพธ์ออกมาคือ Yugo

snapshot133

หรือตัวอย่างที่เป็นการ Intersection กันก็จะได้ผลลัพธ์คือ BMW กับ Aztec ดังรูป

snapshot134

แต่มันมีประเด็นคือ  เหมือนมีจุดที่ในหนังสือจะพิมพ์ไม่ถูก (เอ … หรือว่า mono ทำงานไม่ถูกหว่า)

ในหนังสือเขาเขียนว่าเวลาที่เอามา Concatenate กัน แล้วอยากจะ remove อันที่ซ้ำกันไปก็ให้ใช้ extension method ชื่อ Distinct() แล้วมันควรจะพิมพ์ผลลัพธ์คือ  Yugo Aztec BMW Sabb Aztec ออกมา …. คือมันจะมี Aztec ออกมาทำไม 2 ตัวฮะ … สงสัยจะพิมพ์เพลิน

snapshot135

ผลลัพธ์มันควรจะเป็นแบบนี้ครับ

snapshot136

Travel, Uncategorized

Communication in the cockpit Part 2

มาต่อเรื่องเมื่อวานนิดหน่อย (เหมือนโควต้าเขียนเรื่องเที่ยวในเดือนนี้จะหมดแล้วแฮะ) หลายสายการบินก็พยายามที่จะหาทางเพิ่มความปลอดภัยทางด้านการบิน รวมถึงลดข้อผิดพลาดต่างๆ ที่มนุษย์อาจทำให้เกิดขึ้น

อย่าลืมว่ามนุษย์ทำเรื่องผิดพลาดอยู่เสมอ ซึ่งนั่นก็รวมถึงกัปตันบนเครื่องบินด้วย

สายการบินก็จะการฝึกอบรมเกี่ยวกับ CRM (Crew Resources Management) ซึ่งจะ focus ไปที่ปัจจัยที่เกี่ยวกับมนุษย์ทางด้านการบิน ยกตัวอย่างเช่นในอดีตกัปตันเป็นผู้ออกคำสั่ง และให้คนอื่นปฏิบัติตาม ซึ่งลูกเรือคนอื่นก็ลูกสึกลำบากใจที่จะโต้แย้แม้ว่าเขาไม่เห็นด้วยกับคำสั่งนั้น ซึ่งมันเป็นการสื่อสารที่แย่มากและก็นำพาไปสู่อุบัติเหตุอันใหญ่หลวงอยู่หลายครั้ง

ทุกวันนี้ก็เลยมีการฝึกอบรมโปรแกรมนี้ขึ้นเพื่อให้นักบินเด็กๆ รุ่นใหม่ๆ กล้าที่จะพูดขึ้นมา ถ้าเขาไม่เห็นด้วยกับสิ่งที่กัปตันตัดสินใจ

CRM Training ก็จะเป็นการพัฒนาเรื่องการสื่อสารระหว่างลูกเรือด้วยเช่นกัน มันก็สอนให้กัปตันควรจะมอบหมายอำนาจหน้าที่ความรับผิดชอบเพื่อจะลดภาระงานเมื่อเกิดเหตุฉุกเฉินขึ้น

ยกตัวอย่างสายการบิน Qantas เครื่องบิน Airbus A380 ที่บินจากสิงคโปร์ไปซิดนี่ย์ เครื่องยนต์เกิดระเบิดขึ้นและอาจจะเกิดปัญหากับโครงสร้างของเครื่องบินด้วย แต่ด้วยความพยายามของลูกเรือทุกคนที่อยุ่ใน Cockpit ที่สามารถทำงานประสานกันและปฏิบัติการได้อย่างรวดเร็วทำให้สามารถรักษา 469 ชีวิตบนเครื่องเอาไว้ได้ … ซึ่งจะเห็นว่าพวกเขาได้รับการฝึกอบรมเรื่อง CRM มาอย่างดี

 

จริงๆแล้วกัปตัน Lim เขียนเรื่อง CRM ยาวกว่านี้อีก แต่ผมตัดมาแค่นี้ละกัน แต่อ่านแล้วก็อยากให้พวกเราย้อนมองดูตัวเองว่า ในฐานะกัปตันของหน่วยงานและองค์กรของเรา … เรารับฟังลูกน้องเรามากน้อยแค่ไหน … และลูกน้องมีการแสดงความคิดเห็นแย้งกับเราแล้วกล้าพูดกับเรามากน้อยแค่ไหน … รีบแก้ไขซะ… อย่ารอให้เกิดโศกนาฎกรรมก่อนแล้วมาเสียใจทีหลัง

 

Travel

Communication in the cockpit Part 1

หลังจากบล็อกแบบหนีเที่ยวมา 2 วัน วันนี้ขอมีสาระหน่อย แต่เอาสาระตามประสาคนชอบเที่ยวละกัน

เห็นพี่กร blog เรื่อง communication มา 2-3 วันหลัง ประกอบกับที่เคยบอกไว้เมื่อวันก่อนว่าจะเอาเรื่องกัปตัน Lim ที่ชอบเล่าประสบกาณ์เกี่ยวกับการบินลงในนิตยสาร Travel 3Sixty อยู่บ่อยๆ มาเล่าให้ฟัง มีอยู่ตอนนึงแกพูดถึงปัญหาของการสื่อสารใน Cockpit ให้ฟัง

ด้วยเทคโนโลยีการบินเดี๋ยวนี้ก้าวหน้าไปมาก โอกาสที่เครื่องยนต์จะพัง ปีจะชำรุด หรืออุปกรณ์ส่วนใดส่วนหนึ่งเสียหายจนขนาดเครื่องบินต้องประสบอุบัติเหตุตกนั้นเป็นไปได้น้อยมาก และในอนาคตมันก็จะน้อยลงไปอีกเพราะวิศวกรการบินก็จะสรรหาวิธีการที่จะทำให้เครื่องบินสามารถบินได้อย่างปลอดภัยที่สุด

แต่ในอีกด้านนึงปัญหาที่เกี่ยวกับ Human Error ยังเกิดขึ้นได้ตลอดเวลา มนุษย์ก็คือมนุษย์สามารถทำผิดพลาดได้เสมอ

ในสมัยก่อนกัปตันส่วนใหญ่จะมาจากสายทหาร คำสั่งคือคำสั่ง เด็ดขาด ให้ทุกคนปฏิบัติตาม นักบินผู้ช่วยก็เกรงใจด้วยความที่เห็นว่ากัปตันเป็นผู้มีประสบการณ์มากกว่า เป็นหัวหน้าก็เลยไม่กล้าที่จะแย้งอะไร หรือบางครั้งกัปตันเองก็ทนงตน มีความมั่นในสูงจนไม่ฟังลูกน้องด้วยเช่นกัน

ในปี 1997 เครื่องบินสายการบิน Pan American ประสบอุบัติเหตุชนกับ เครื่องบินของ KLM ที่เกาะ Canary เป็นอุบัติเหตุครั้งที่เลวร้ายที่สุดในศรรตวรรตเลยทีเดียว สูญเสียชีวิตคนไปกว่า 600 คน
เครื่องบินของสายการบิน KLM ที่ถูกบังคับโดยกัปตันที่เป็นครูฝึกผู้มากประสบการณ์ขึ้นบินโดยที่ไม่ได้ขอ Clearance และนักบินผู้ช่วยไม่กล้าพอที่จะตั้งคำถามกับกัปตันในเรื่องนี้และคิดว่ากัปตันคงทำถูกเสมอ … และก็เป็นสาเหตุที่เกิดอุบัติเหตุในที่สุด

ในเดือนมกราคมปี 2004 เครื่องบินโบอิ้ง 737-300 ที่เพิ่งทยานขึ้นจากสนามบิน Sharm el-Sheikh International Airport กำลังมุงหน้าตรงไปยังทะเลแดง กับตันนอกจากจะเป็นผู้ที่มีประสบการณ์การบินมากที่สุดในอียิปต์แล้วก็ยังได้ครับความนับถือในฐานะ Hero ของสงครามด้วย ในระหว่างการบินนั้นกัปตันได้ทำความผิดพลาดและนักบินผู้ช่วยก็ได้เห็นความผิดพลาดนั้น แต่ก็ไม่ได้มีความคิดที่จะโต้แย้งหัวหน้าผู้มากประสบการณ์ของเขาเลย และก็เป็นที่มาของอุบัติเหตุที่เกิดขึ้น

หรืออีกตัวอย่างนึงในเดือนพฤษภาคม ปี 2010 กัปตันเครื่องบินโบอิ้ง 737 ทีบินมากจาก Dubai มุงหน้าสู่ Mangalore ไม่สนใจคำแนะนำที่บอกว่าเครื่องไม่น่าจะสามารถลงจอดใด้ของนักบินผู้ช่วยที่เห็นๆ อย่างน้อย 2 ครั้ง จนในที่สุดก็ประสบอุบัติเหตุสูญเสียไป 158 ชีวิตในครั้งนั้น

Travel

On the sunrise beach

ผมยืนอยู่บนโป๊ะกับคนอีกเป็นร้อย ด้านล่างเป็นพื้นทะละสีครามที่เราเห็นปลาแหวกว่าย พร้อมกับเรือเล็กอยู่รอบๆ โป๊ะ

ผมเรียกเรือเล็กนั่นว่า “กอนโดล่า”

บนโป๊ะมีการเก็บค่ากำจัดขยะและค่าเรือที่จะพาพวกเราไปที่หาดชาวเล .. หรือชื่อในภาษาอังกฤษว่า Sunrise beach

เราลงเรือกันเป็นกลุ่มท้ายๆ โดยไม่รู้เลยว่าจะไปยังไงต่อ ได้แต่บอกลุงคนขับเรือว่าไป Sunrise Beach ทันใดนั้นก็มีแก๊งใหญ่ตะโกนสวนขึ้นมาว่า “ไปลงโรงเรียนเลยลุง” …”ไปโรงเรียนหมดเลยนะ” ลุงตอบ … พวกเรานั่งเงียบเพราะไม่รู้จริงๆ ว่าตกลงโรงเรียนมันอยู่ตรงไหน แล้วลุงก็ออกเรือไป ผมนั่งปวดตูดอยู่บนเหล็กที่ลุงแกใช้เป็นบันไดสำหรับลงเรือ ลุงขับเรืออ้อมเกาะไปอีกฝั่งอย่างช้าๆ

น้ำทะเลใสๆ  เรียกเสียงฮือฮาเป็นระยะๆ  เหมือนผมจะเลิกสนใจทุกอย่างและชื่นชมอยู่กับความงามตรงหน้านั้น ลุงพาเรามาส่งที่โรงเรียน พวกเรางงหลงทิศว่าจะไปทางไหน ลุงก็ไม่รู้ว่า Wapi Resort ที่เราจองไว้มันอยู่ตรงไหนเหมือนกัน .. แต่โลกวันนี้ง่ายมาก ก็เปิดแผนที่บนมือถือดูสิ ขอบคุณ 3G ทั่วประเทศคร๊าบบ

ถึงที่พักเราเก็บของแล้วก็ออกไปชมทะเล … เราไม่เคยมาทะเลใต้ช่วงเดือนนี้เลย ส่วนใหญ่เราไปกันหน้ามรสุมตลอด เพราะมันถูกนั่นแหล่ะ มาอันดามันเดือนมกราคมไม่น่าเชื่อว่ามันจะสวยขนาดนี้

เราตัดสินใจยกเลิกแผนที่จะไป 1 Day Trip ในวันรุ่งขึ้นแบบไม่ยากเย็น เพราะสิ่งที่อยู่ตรงหน้ามันสะกดให้เราอยากจะอยู่ตรงนั้น อยากนั่งมองทะเลสวยๆ รับแดดรับลมแค่นั้น ไม่ต้องการอะไรอีกแล้วจริงๆ

ผมลืมเรื่อง Kindle ไปซะฉิบ …  นึกขึ้นได้ก็โทรหาพี่โอ๋ และ Jolly Tour หลังจากที่เช็คกันอยู๋นานว่าใครกันแน่ไปรับพวกผม สุดท้ายก็เจอว่าเป็นรถตู้ของอีกบริษัทนึงที่เขาฝากรับผมมาด้วย … และเขาก็เจอ kindle ผมแล้ว ให้มารับที่ Jolly Tour วันกลับนะ

ขอบคุณพี่โอ๋ และ Jolly Tour มากๆ ครับ

ผมนั่งอ่านหนังสือชมทะเลตลอดบ่าย อยากจะหนีความวุ่นวายมาอยู่นี่ ….

 

Travel

เช้าที่หาดใหญ่ ก่อนจะไปหลีเป๊ะ

เรามาถึงหาดใหญ่เมื่อคืน ได้นอนพักโรงแรมหลอนที่ดูเหมือนจะมีเพียงพวกเราและแขกอีก 2 ห้องเท่านั้นที่เข้าพักโรงแรมสภาพเก่ามาก แต่ด้วยความที่เราอยากประหยัดเงินเพราะเราจะใช้แค่ไม่กี่ชั่วโมงเท่านั้นก่อนเดินทางออกไปหลีเป๊ะ

หลอนชนิดที่ว่า ออกจากลิฟท์มามีผู้หญิงผอมตัวเล็กๆ นั่งยองๆ คุยโทรศัพท์อยู่หน้าลิฟท์แล้วใจร่วงไปอยู่ตาตุ่ม

เราจองทัวร์ไปหลีเป๊ะแบบด่วนๆ ที่สนามบินรวมไปกลับค่าเรือค่ารถตู้ไปรับถึงโรงแรมก็ประมาณ 1600 บาท (ขออภัยที่เรื่องนี้ไม่รู้ว่าจะชี้ทางประหยัดยังไงเพราะเราไม่ได้เตรียมตัวอะไรกันมาก่อนเลย ขออภัยไว้ด้วย)

เราซื้อน้ำเป็น pack จาก 7-11 ขึ้นรถตู้ไปด้วย เพราะที่เกาะของแพงมาก

รถใช้เวลาวิ่งราวๆ 2 ชั่วโมง ก็มาถึงท่าเรือปากบารา อ.ละงู จ.สตูล เรือออกประมาณ 11:30 มีเวลาอีกประมาณ 20 นาที ก็ไปหาข้าวกินรองท้องกันก่อน ร้านอาหารใต้แถวๆ 7-11 ตรงท่าเรือปากบารา นอกจากจะไม่ค่อยอร่อยแล้วยังแพงอีกต่างหาก 😦

เรารีบวิ่งไปเช็คอินรับตั๋วเรือจากพี่โอ๋ บริษัททัวร์ที่เราซื้อไว้แล้วก็รีบเดินไปขึ้นเรือ เสียค่าผ่านท่าเรืออีกต่างหาก 20 บาท

แล้วผมก็รู้สึกตัวว่า “ลืม Kindle ไว้บนรถตู้”

ผมรีบวิ่งออกมาหาพี่โอ๋อีกครั้งเพื่อให้พี่โอ๋ติดต่อคนขับรถตู้ให้ พี่โอ๋ก็ให้พี่พนักงานอีกคนพาผมไปหา Jolly Tour ที่เป็นคนรับผมมาจากโรงแรม ทาง Jolly Tour ก็รีบติดต่อคนขับรถของเขาให้ แต่เขานึกไม่ออกว่าใครกันแน่เป็นคนรับผมมาจากโรงแรม …พี่ จนท. ที่ Jolly Tour รับปากว่าจะตามเรื่องให้แล้วจะโทรไปบอก

แล้วผมก็รีบวิ่งกลับไปขึ้นเรือที่กำลังจะออกนั่นแหล่ะ… ฝากความหวังไว้กับพี่โอ๋ กับ พี่ๆ ที่ Jolly Tour

เรือเฟอร์รีลำใหญ่ติดแอร์ ผมนอนหลับตลอด 2 ชั่วโมง

และแล้ว … เราก็มองเห็นเกาะหลีเป๊ะ

Travel

3 Sixty

วันนี้หนีมาเที่ยวบินมาหาดใหญ่ด้วย Airasia เหมือนเคย สิ่งที่เปลี่ยนไปคือหนังสือ 3Sixty กลายเป็น version สำหรับคนไทยโดยเฉพาะ ปกติแล้วหนังสือเล่มนี้จะมีเนื้อหาน่าสนใจหลายอย่าง โดยเฉพาะที่ผมชอบมากที่สุดคือคอลัมภ์ของกัปตัน Lim ที่แกมักจะเอาแง่คิดด้านการบินมาเล่าให้ฟัง อย่างเช่นตอนที่หนังเรื่อง flight ออกฉาย ก็มีคนมาถามแกว่ามันเป็นไปได้ด้วยเหรอที่จะเครื่องบินหงายท้องบิบ หรืออีกตอนที่แกอธิบายว่า ถ้านักบินบนเครื่องไม่สามสามารถบังคับเครื่องได้ ใครเหมาะสมที่สุดที่จะบังคับเครื่องบินแทน ระหว่าง Flight Attendance หรือผู้โดยสารที่ชอบเล่นเกม simulation

มีตัวอย่างหลายตอนที่แกเขียนได้สนุกมากไว้จะมาเล่าให้ฟังในตอนต่อๆไป

Programing

LINQ ของเก่าๆ แบบเบื้องต้น

วันนี้ขอเกเรหนึ่งวัน

ด้วยความที่อดหลับอดนอนมาทั้งคืน อ้อ ต้องบอกว่าตั้งแต่เมื่อวานตอนเช้ายันตอนนี้ก็น่าจะเกือบ 40 ชั่วโมงและสมองตอนนี้ไม่สั่งงานอะไรแล้ว

งั้นวันนี้ผมขอเอางานเก่าๆ มาแป๊ะไว้ … อันนี้เขียนไว้เมื่อ 5 ปีที่แล้ว อ้างอิงมาจากหนังสือ ” Accelerated VB 2008 เขียนโดย Trey Nash” ไอ้เจ้าตัว LINQ บัดนี้มันพัฒนาไปไหนต่อไหนแล้วแหล่ะ แต่ว่าเอกสารข้างล่างนี้มันก็ยังเป็นการ Introduction to LINQ ได้อยู่นะ … เผื่อใครอยากอ่าน …. คลิ๊กที่ Link ด้านล่างนี้ได้เลย

LINQ-1

ขอกราบขออภัยในความมึนของผมมานะที่นี้ด้วย 😦

Postgresql

“IS DISTINCT FROM” ท่าประหลาดใน postgresql

สมมติว่าผมมีข้อมูลหน้าตาอยู่ประมาณนี้นะครับ

pstatus คือสถานะการจ่ายเงินค่าเทอม ซึ่งเป็นไปได้ทั้ง

NULL
1 – ชำระเรียบร้อย
2 – รอตรวจสอบ
3 – ยังไม่ชำระ

snapshot128

คำถามคือ ถ้าผมต้องการข้อมูลคนที่ สถานะ ไม่ใช่ “ชำระเรียบร้อย” ทั้งหมด จะเขียน query ว่าเยี่ยงใด

ขนมใช่ไหมครับ

SELECT *  FROM student WHERE  pstatus <> 1;

…… ซึ่งคำตอบนี้ไม่ถูกครับ … เพราะ Query ด้านบนนี้มันให้ผลลัพธ์แบบนี้

snapshot129

เห็นไหมครับ … MR.C  , MR.E และ MR.G ไปไหนหว่า?

การทำงานกับข้อมูลที่มันสามารถเป็น Null ได้ก็ต้องปวดหัวแบบนี้แหล่ะ

ถ้าจะให้ถูกต้องเขียนว่า

SELECT *  FROM student WHERE  (pstatus <> 1) OR (pstatus is null);

snapshot130

ซึ่ง Postgresql เขาก็มีท่ายากมาให้เราใช้กันสำหรับกรณีแบบนี้ … สามารถเขียนได้เป็น

SELECT *  FROM student WHERE  (pstatus is distinct from 1);

snapshot131

 

สั่ง SQL ในการ create table กับ insert data อยู่ที่นี่นะครับ
http://pastebin.com/tb92BqiQ

รายละเอียดการใช้ “IS DISTINCT FROM” ดูได้จากที่นี่เลยขอรับ
http://www.postgresql.org/docs/current/interactive/functions-comparison.html